/ Hex Artifact Content
Login

Artifact 43b93fe757bfffe00f97462596418b052eefdccd:


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 73 71 6c 69 74 65 33 4f 6f  0;.    sqlite3Oo
0a30: 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 76 65 6c  mFault(pToplevel
0a40: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->db);.  }.}../*
0a50: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0a60: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0a70: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0a80: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
0a90: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
0aa0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
0ab0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
0ac0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
0ad0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
0ae0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0af0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0b00: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0b10: 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73 71  ; ..  pVdbe = sq
0b20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0b30: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
0b40: 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20 73  pVdbe!=0 ); /* s
0b50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63 61  qlite3GetVdbe ca
0b60: 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45 20  nnot fail: VDBE 
0b70: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0b80: 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
0b90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ba0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0bb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0bc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0bd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0be0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0c00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0c10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0c20: 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c  Tab, p->isWriteL
0c30: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
0c40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
0c50: 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ame, P4_STATIC);
0c60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
0c70: 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65  define codeTable
0c80: 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a  Locks(x).#endif.
0c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ca0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
0cb0: 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20 69  yDbMask object i
0cc0: 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74 20  s empty - if it 
0cd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31  contains no.** 1
0ce0: 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75   bits.  This rou
0cf0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79 20  tine is used by 
0d00: 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  the DbMaskAllZer
0d10: 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e 6f  o() and DbMaskNo
0d20: 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f  tZero().** macro
0d30: 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 41  s when SQLITE_MA
0d40: 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67 72  X_ATTACHED is gr
0d50: 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a 2a  eater than 30..*
0d60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
0d70: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e 74  _ATTACHED>30.int
0d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41 6c   sqlite3DbMaskAl
0d90: 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d 29  lZero(yDbMask m)
0da0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0db0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 79  (i=0; i<sizeof(y
0dc0: 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69 66  DbMask); i++) if
0dd0: 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( m[i] ) return 
0de0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
0df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0e10: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0e20: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0e30: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e40: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0e60: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e70: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e80: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e90: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0ea0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0eb0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0ec0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0ed0: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0ee0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0ef0: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0f00: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0f10: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0f20: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0f30: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0f40: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0f50: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f70: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f80: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0fa0: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0fb0: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0fe0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1010: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1020: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1030: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
1040: 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  K ) pParse->rc =
1050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1070: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
1080: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
1090: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
10a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
10c0: 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  am.  */.  v = sq
10d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10f0: 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  !pParse->isMulti
1100: 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c 7c  Write .       ||
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
1120: 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70 50  rtMayAbort(v, pP
1130: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 29  arse->mayAbort))
1140: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1150: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 56   while( sqlite3V
1160: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
1170: 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  code(v, OP_Close
1180: 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ) ){}.    sqlite
1190: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a0: 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51  P_Halt);..#if SQ
11b0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
11c0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28  TICATION.    if(
11d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c   pParse->nTableL
11e0: 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69  ock>0 && db->ini
11f0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
1200: 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41 75     sqlite3UserAu
1210: 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  thInit(db);.    
1220: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
1230: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
1240: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ser ){.        p
1250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1260: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1290: 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69  ser not authenti
12a0: 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  cated");.       
12b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
12c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
12e0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
12f0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
1310: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1320: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1330: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1340: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1350: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1360: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1370: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1380: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1390: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
13a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13b0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
13c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
13d0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
13e0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
13f0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1400: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1420: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
1430: 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72  && (DbMaskNonZer
1440: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1450: 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d  Mask) || pParse-
1460: 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20  >pConstExpr).   
1470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1480: 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  b, i;.      asse
1490: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  rt( sqlite3VdbeG
14a0: 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f  etOp(v, 0)->opco
14b0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
14c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a  JumpHere(v, 0);.
14e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b        for(iDb=0;
14f0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1500: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
1510: 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61  ( DbMaskTest(pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  rse->cookieMask,
1530: 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69   iDb)==0 ) conti
1540: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1550: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1560: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
1570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1580: 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20  dOp4Int(v,.     
1590: 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74       OP_Transact
15a0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
15c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
1600: 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28       DbMaskTest(
1610: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1620: 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f  k,iDb), /* P2 */
1630: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1640: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1650: 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Db],          /*
1660: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P3 */.         
1670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1680: 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69  chema->iGenerati
1690: 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20  on  /* P4 */.   
16a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16c0: 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  y==0 ) sqlite3Vd
16d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
16e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16f0: 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20  mment((v,.      
1700: 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d          "usesStm
1710: 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50  tJournal=%d", pP
1720: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26  arse->mayAbort &
1730: 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  & pParse->isMult
1740: 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20  iWrite));.      
1750: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1770: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1780: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1790: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
17a0: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
17b0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17c0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
17d0: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
17e0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
17f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1800: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1810: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1820: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
1830: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
1840: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
1850: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1860: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1870: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1880: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1890: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
18a0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
18b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
18c0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
18d0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
18e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
18f0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1900: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1920: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1930: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1940: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1960: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1970: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1990: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
19a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
19b0: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
19c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
19d0: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
19e0: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
19f0: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a00: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1a10: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1a20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1a30: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1a40: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1a50: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1a70: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ab0: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1ac0: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1ad0: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1af0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b00: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1b10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b20: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1b30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1b40: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
1b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
1b60: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1b70: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1b80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1b90: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1ba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
1bb0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1bc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1bd0: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1be0: 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  evel==0 );  /* D
1bf0: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1c00: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1c10: 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d      /* A minimum
1c20: 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69   of one cursor i
1c30: 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75  s required if au
1c40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  toincrement is u
1c50: 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74  sed.    *  See t
1c60: 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31  icket [a696379c1
1c70: 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69  f08866] */.    i
1c80: 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63  f( pParse->pAinc
1c90: 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  !=0 && pParse->n
1ca0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
1cb0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73  >nTab = 1;.    s
1cc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1cd0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a  ady(v, pParse);.
1ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1d10: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1d20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1d30: 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  We are done with
1d40: 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a 65   this Parse obje
1d50: 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ct. There is no 
1d60: 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74 69  need to de-initi
1d70: 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66 20  alize it */.#if 
1d80: 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  0.  pParse->colN
1d90: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 70  amesSet = 0;.  p
1da0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1dd0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1de0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44  e->nVar = 0;.  D
1df0: 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73 65  bMaskZero(pParse
1e00: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 23  ->cookieMask);.#
1e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1e20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1e30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1e40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1e50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1e60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1e70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1e80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1e90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1ea0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1eb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ec0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ed0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ee0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1ef0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1f00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1f10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1f20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1f30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1f40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1f50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1f60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1f70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1f80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1f90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1fa0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1fb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1fc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1fd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1fe0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1ff0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2000: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
2010: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
2020: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
2030: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
2040: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2050: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
2060: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
2070: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2080: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
20c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20d0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
20e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
2100: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
2110: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
2120: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
2130: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
2140: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
2150: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
2170: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
2180: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
2190: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
21a0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
21c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
21d0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
21e0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
21f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2200: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2210: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2220: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2230: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2240: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2250: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
2260: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
2270: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
2280: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
2290: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
22a0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
22b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
22c0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
22d0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
22e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
2300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2310: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
2320: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
2330: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
2340: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
2350: 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ed--;.}..#if SQL
2360: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2370: 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65  ICATION./*.** Re
2380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61  turn TRUE if zTa
2390: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
23a0: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61  of the system ta
23b0: 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
23c0: 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75  the.** list of u
23d0: 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61  sers and their a
23e0: 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c  ccess credential
23f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2400: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63  3UserAuthTable(c
2410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2420: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2430: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61  ite3_stricmp(zTa
2440: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65  ble, "sqlite_use
2450: 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  r")==0;.}.#endif
2460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2470: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2480: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2490: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
24a0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
24b0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
24c0: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
24d0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
24e0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
24f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2500: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2510: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2520: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2530: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
2540: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
2550: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
2560: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
2570: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2580: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2590: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
25b0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
25c0: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
25d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
25e0: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
25f0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2600: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2610: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2620: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
2630: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2660: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
2670: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2690: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
26a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
26b0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
26c0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
26d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ..  /* All mutex
26e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
26f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
2700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
2710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
2720: 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62 61   assert( zDataba
2730: 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se!=0 || sqlite3
2740: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2750: 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66 20  exes(db) );.#if 
2760: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2770: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20  ENTICATION.  /* 
2780: 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20 75  Only the admin u
2790: 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ser is allowed t
27a0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
27b0: 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62 6c  sqlite_user tabl
27c0: 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f  e.  ** exists */
27d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e  .  if( db->auth.
27e0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
27f0: 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65 33  Admin && sqlite3
2800: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a 4e  UserAuthTable(zN
2810: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ame)!=0 ){.    r
2820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
2830: 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54  dif.  for(i=OMIT
2840: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2850: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2860: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2870: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
2880: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2890: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
28a0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
28b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
28c0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2900: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2910: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2930: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2940: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2950: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2970: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2980: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2990: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29b0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29c0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29d0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
29e0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
29f0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a00: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a10: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a40: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2a50: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2a60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a80: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2a90: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2ab0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2ac0: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2ad0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2ae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2af0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b00: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2b10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2b20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2b30: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2b40: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2b50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b60: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2b70: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2b80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2b90: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2ba0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2bb0: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2bc0: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2bf0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2c00: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2c10: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2c20: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2c30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c40: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2c60: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2c70: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2c80: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2c90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2ca0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2cb0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2cc0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2cd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2ce0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2cf0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2d00: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2d30: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2d40: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2d50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d70: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2d80: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2d90: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2da0: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2db0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73  LTABLE.    if( s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
2de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62  (pParse->db, zDb
2df0: 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20  ase)<1 ){.      
2e00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74  /* If zName is t
2e10: 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  he not the name 
2e20: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
2e30: 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 64  e schema created
2e40: 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   using.      ** 
2e50: 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65  CREATE, then che
2e60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2e70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e80: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  n virtual table 
2e90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61  that.      ** ca
2ea0: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65   */.      Module
2ed0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2ee0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2ef0: 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  d(&pParse->db->a
2f00: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
2f10: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26        if( pMod &
2f20: 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f  & sqlite3VtabEpo
2f30: 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28  nymousTableInit(
2f40: 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b  pParse, pMod) ){
2f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f60: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f80: 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61  dif.    if( zDba
2f90: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
2fa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fb0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
2fc0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
2fd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3000: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3020: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3030: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 0a  chema = 1;.  }..
3040: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3050: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3060: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3070: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3080: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3090: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
30b0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30c0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
30d0: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
30e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30f0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3100: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3110: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3120: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3130: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3140: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3150: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3160: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3170: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3180: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3190: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
31a0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
31b0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
31c0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
31d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
31e0: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
31f0: 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73 56  arse, .  int isV
3200: 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20 53  iew, .  struct S
3210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3220: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3230: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3240: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3250: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3260: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3270: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3290: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
32a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
32b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
32c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
32d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ].zName;.  }else
32e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a  {.    zDb = p->z
32f0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20  Database;.  }.  
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
3320: 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61  , isView, p->zNa
3330: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3340: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3350: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3360: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3370: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3380: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
33a0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
33b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
33d0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
33e0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
33f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3400: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3410: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3420: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3430: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3450: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3460: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3470: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3480: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3490: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
34a0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
34b0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
34c0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
34d0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
34e0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
34f0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3500: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3510: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3520: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3530: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3540: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3550: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3560: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3570: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3580: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3590: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
35a0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
35b0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
35c0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
35d0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
35e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
35f0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3600: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3620: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3630: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3640: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3650: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3660: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3670: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3680: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3690: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
36a0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
36b0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
36c0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
36d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
36f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3700: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
3710: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
3720: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
3730: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
3740: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3770: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
3780: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
3790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
37a0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
37b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
37c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
37e0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
37f0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3820: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3840: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
3850: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
3860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3870: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3880: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3890: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
38a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
38b0: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
38c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
38d0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
38f0: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3920: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
3930: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
3940: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
3950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3960: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3970: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3980: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3990: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
39a0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
39b0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
39c0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
39d0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39e0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
39f0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3a00: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3a10: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3a20: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
3a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
3a40: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
3a50: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3a60: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3a70: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3a80: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3a90: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3aa0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3ab0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3ac0: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3b00: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3b10: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3b20: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3b30: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3b40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3b50: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3b60: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3b70: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3b80: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3b90: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3ba0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3bb0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3bc0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3bd0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3be0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3c00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3c10: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3c20: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3c30: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3c40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3c50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3c60: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3c70: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3c80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3ca0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3ce0: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3cf0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3d10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3d20: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3d30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3d40: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3d50: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3d60: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3d70: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3d80: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3d90: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3da0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3db0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3dc0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3dd0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3de0: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3df0: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3e00: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3e10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3e30: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3e40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3e50: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3e70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3e80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3e90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ec0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3ed0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3ee0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3f00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3f10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3f20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3f30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
3f40: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3f50: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3f60: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3f70: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f80: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f90: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3fa0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3fc0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3fd0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3fe0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4000: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4010: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4020: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
4030: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
4040: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4060: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4070: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4080: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4090: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
40a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
40b0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
40c0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
40d0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
40e0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
40f0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4100: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4110: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
4130: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
4170: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4180: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4190: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
41a0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
41b0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
41c0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
41d0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
41e0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
41f0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4200: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4210: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
4220: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4230: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
4240: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4250: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
4260: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4270: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4280: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4290: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
42a0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
42b0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
42c0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
42d0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
42e0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
42f0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4300: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4310: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4320: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4330: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4340: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4350: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4360: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4370: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4380: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4390: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
43a0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
43b0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
43c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43d0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4410: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4420: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4440: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4450: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4460: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
44a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
44b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
44c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
44d0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
44e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
44f0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4500: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4510: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
4530: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
4540: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
4550: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
4560: 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  y)..*/.void sqli
4570: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4580: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4590: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
45b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
45c0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
45d0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
45e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
45f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4600: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
4610: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4630: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4640: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
4690: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
46a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
46b0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
46c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
46d0: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
46e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
46f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4700: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
4710: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
4720: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
4730: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
4740: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4750: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
4760: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
4770: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
4780: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
4790: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
47a0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
47b0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
47c0: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
47d0: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
47e0: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
47f0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4800: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
4810: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
4820: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20  e..**.** The db 
4830: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74  parameter is opt
4840: 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65  ional.  It is ne
4850: 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c  eded if the Tabl
4860: 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e  e object .** con
4870: 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20  tains lookaside 
4880: 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20  memory.  (Table 
4890: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
48a0: 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65  chema do not use
48b0: 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  .** lookaside me
48c0: 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65  mory, but some e
48d0: 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
48e0: 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20  bjects do.)  Or 
48f0: 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65  the.** db parame
4900: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
4910: 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73  with db->pnBytes
4920: 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65  Freed to measure
4930: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   the memory.** u
4940: 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65  sed by the Table
4950: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
4960: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4970: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
4980: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
4990: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
49a0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
49b0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
49c0: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
49d0: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
49e0: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
49f0: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73   schema */..  as
4a00: 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c 7c  sert( !pTable ||
4a10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
4a20: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
4a30: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
4a40: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
4a50: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
4a60: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
4a70: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
4a80: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
4a90: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4aa0: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
4ab0: 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29  able->nRef)>0) )
4ac0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52   return;..  /* R
4ad0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ae0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4af0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4b00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4b10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4b20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4b30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4b40: 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20  .  Since schema 
4b50: 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73  Tables do not us
4b60: 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  e.  ** lookaside
4b70: 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68  , this number sh
4b80: 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e  ould not change.
4b90: 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   */.  TESTONLY( 
4ba0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64 62  nLookaside = (db
4bb0: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
4bc0: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
4bd0: 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20  eral)==0) ?.    
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4c00: 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a  de.nOut : 0 );..
4c10: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4c20: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4c30: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4c40: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4c50: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4c60: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4c70: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4c80: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4c90: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4ca0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4cb0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4cc0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4cd0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4ce0: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4cf0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4d00: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4d10: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4d20: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4d30: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4d40: 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26  sert(.         &
4d50: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
4d60: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
4d70: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
4d80: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20    assert( db==0 
4d90: 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  || sqlite3Schema
4da0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
4db0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4dc0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
4dd0: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
4de0: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
4df0: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
4e00: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4e10: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4e20: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4e30: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4e40: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4e50: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4e60: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4e70: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4e90: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4ea0: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
4eb0: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
4ec0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4ed0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
4ee0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
4ef0: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4f00: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
4f10: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4f20: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
4f30: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
4f40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
4f50: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
4f60: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
4f70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4f80: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
4f90: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
4fa0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
4fb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fc0: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
4fd0: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
4fe0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
4ff0: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5000: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5010: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5020: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5030: 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  e==db->lookaside
5040: 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .nOut );.}../*.*
5050: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5060: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5070: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5080: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5090: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
50a0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
50b0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
50c0: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
50d0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
50e0: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
50f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5100: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5110: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5120: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5130: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
5140: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5150: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5160: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5170: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5190: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
51a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
51b0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
51c0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
51d0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
51e0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
51f0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5200: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5210: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5220: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5230: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
5240: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5250: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5260: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5270: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
5280: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
5290: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
52a0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
52b0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
52c0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
52d0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
52e0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
52f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5300: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5310: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5320: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
5330: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
5340: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5350: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
5360: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
5370: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
5380: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5390: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
53a0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
53b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
53c0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
53d0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
53e0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
53f0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5400: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5410: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5420: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5430: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
5440: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
5450: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5460: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
5470: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
5480: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5490: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
54a0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
54b0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
54c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
54d0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
54e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
54f0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5500: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5510: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5520: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5530: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
5540: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
5560: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
5570: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5580: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
5590: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
55a0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
55b0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
55c0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
55d0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
55e0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
55f0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5600: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5610: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5620: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5630: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
5640: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
5650: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
5660: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
5670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
5680: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
5690: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
56a0: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
56b0: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
56c0: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
56d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
56e0: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
56f0: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5700: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5720: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5730: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
5740: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5750: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5760: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
5770: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5780: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5790: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
57a0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
57b0: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
57c0: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
57d0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
57e0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
57f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5800: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5810: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5820: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5830: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
5840: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
5850: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72  Db *pDb;.    for
5860: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
5870: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
5880: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5890: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  -){.      if( 0=
58a0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
58b0: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
58c0: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
58d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
58e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
58f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
5900: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
5910: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
5920: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
5930: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5940: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5950: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
5960: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
5970: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
5980: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
5990: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
59a0: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
59b0: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
59c0: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
59d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
59e0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
59f0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
5a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
5a30: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
5a40: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a60: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
5a70: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
5a80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
5a90: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5aa0: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5ab0: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5ac0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5ad0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5ae0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5af0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5b00: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5b10: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5b20: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5b30: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5b40: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5b50: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5b60: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5b70: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5b80: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
5b90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5ba0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5bb0: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5bc0: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5bd0: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5be0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5bf0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
5c00: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
5c10: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5c20: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
5c30: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5c40: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
5c50: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5c60: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5c70: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
5c80: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5c90: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5ca0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5cb0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5cc0: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5cd0: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5ce0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5cf0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
5d00: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
5d10: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
5d20: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
5d30: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
5d40: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
5d50: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5d60: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5d70: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5d80: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5d90: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5da0: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5db0: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5dc0: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5dd0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5de0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5df0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5e00: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5e10: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5e20: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5e30: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5e40: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5e50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5e70: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
5e80: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
5e90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5ea0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
5eb0: 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b  rt( pName2!=0 );
5ec0: 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e  .  if( pName2->n
5ed0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
5ee0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
5ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
5f10: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
5f20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5f30: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
5f40: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
5f50: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
5f60: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
5f70: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
5f80: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
5f90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5fa0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5fb0: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5fc0: 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  e1);.      retur
5fd0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
5fe0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ff0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
6000: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
6010: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
6020: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6030: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6040: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
6050: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
6060: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6070: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6080: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6090: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
60a0: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
60b0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
60c0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
60d0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
60e0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
60f0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
6100: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
6110: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
6120: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6130: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6140: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6150: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6160: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6170: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6180: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6190: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
61a0: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
61b0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
61c0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
61d0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
61e0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
61f0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
6200: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
6210: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
6220: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
6230: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
6240: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
6250: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
6260: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
6270: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
6280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6290: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
62a0: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
62b0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
62c0: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
62d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
62e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
62f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6310: 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  n the PRIMARY KE
6320: 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  Y index of a tab
6330: 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  le.*/.Index *sql
6340: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
6350: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dex(Table *pTab)
6360: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20  {.  Index *p;.  
6370: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64  for(p=pTab->pInd
6380: 65 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d  ex; p && !IsPrim
6390: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20  aryKeyIndex(p); 
63a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
63b0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
63c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
63d0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
63e0: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
63f0: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
6400: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
6410: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
6420: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
6430: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
6440: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
6450: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
6460: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
6470: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
6480: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
6490: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
64a0: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
64b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
64c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
64d0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
64e0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
64f0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
6500: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
6510: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
6520: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
6530: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
6540: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
6550: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
6560: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6570: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
6580: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6590: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
65a0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
65b0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
65c0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
65d0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
65e0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
65f0: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6600: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6610: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6620: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
6630: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
6640: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6650: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
6660: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
6670: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
6680: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6690: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
66a0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
66b0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
66c0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
66d0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
66e0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
66f0: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6700: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6710: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6720: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6730: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
6740: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
6750: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
6760: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
6770: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
6780: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6790: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
67a0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
67b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
67c0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
67d0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
67e0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
67f0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6800: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6810: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6820: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
6830: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
6840: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6850: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
6860: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6870: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
6880: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6890: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
68a0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
68b0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
68c0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
68d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
68e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68f0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6900: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6910: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6920: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
6930: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
6940: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6950: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
6960: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
6970: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6980: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6990: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
69a0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
69b0: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
69c0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
69d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
69e0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
69f0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
6a00: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6a10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6a20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6a30: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
6a40: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
6a50: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
6a60: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
6a70: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
6a80: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
6a90: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
6aa0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6ab0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69  o create */..  i
6ac0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
6ad0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
6ae0: 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  Tnum==1 ){.    /
6af0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
6b00: 20 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c   Parsing the sql
6b10: 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71  ite_master or sq
6b20: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
6b30: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
6b40: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6b50: 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  b;.    zName = s
6b60: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
6b70: 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  b, SCHEMA_TABLE(
6b80: 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65  iDb));.    pName
6b90: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c   = pName1;.  }el
6ba0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  se{.    /* The c
6bb0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
6bc0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
6bd0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
6be0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
6bf0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
6c00: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
6c10: 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  rn;.    if( !OMI
6c20: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6c30: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
6c40: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
6c50: 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74       /* If creat
6c60: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
6c70: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
6c80: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e  ot be qualified.
6c90: 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a   Unless .      *
6ca0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  * the database n
6cb0: 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e  ame is "temp" an
6cc0: 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  yway.  */.      
6cd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6ce0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
6cf0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
6d00: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
6d10: 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d");.      retur
6d20: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
6d30: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6d40: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
6d50: 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  1;.    zName = s
6d60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6d70: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
6d80: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e    }.  pParse->sN
6d90: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
6da0: 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  e;.  if( zName==
6db0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6dc0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
6dd0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
6de0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
6df0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
6e00: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6e10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
6e20: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
6e30: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
6e40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6e50: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
6e60: 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20  sert( isTemp==0 
6e70: 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a  || isTemp==1 );.
6e80: 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
6e90: 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31  ==0 || isView==1
6ea0: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74   );.  {.    stat
6eb0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64  ic const u8 aCod
6ec0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53  e[] = {.       S
6ed0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
6ee0: 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  LE,.       SQLIT
6ef0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6f00: 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  BLE,.       SQLI
6f10: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a  TE_CREATE_VIEW,.
6f20: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52         SQLITE_CR
6f30: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20  EATE_TEMP_VIEW. 
6f40: 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a     };.    char *
6f50: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6f60: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6f70: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
6f80: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6f90: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
6fa0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
6fb0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6fc0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6fd0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6fe0: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
6ff0: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
7000: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28 69  Check(pParse, (i
7010: 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b  nt)aCode[isTemp+
7020: 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20 20  2*isView],.     
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29    zName, 0, zDb)
7060: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7070: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7090: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
70a0: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
70b0: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
70c0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
70d0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
70e0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
70f0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
7100: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
7110: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7120: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7130: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7140: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7150: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7160: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7170: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7180: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7190: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
71a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
71b0: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
71c0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
71d0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
71e0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
71f0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
7200: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
7210: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
7220: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
7230: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7240: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7250: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7260: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7270: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7280: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7290: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72a0: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
72b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
72c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
72d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
72e0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
72f0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
7300: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7310: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7320: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7330: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7350: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7360: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7370: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7380: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7390: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
73a0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
73b0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
73c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
73d0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
73e0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
73f0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
7400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7410: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7420: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7430: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7440: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7450: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7460: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7470: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7480: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7490: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
74a0: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
74b0: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
74c0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
74d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
74e0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
74f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
7500: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
7510: 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65  r++;.    goto be
7520: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7530: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
7540: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
7550: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
7560: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  -1;.  pTable->pS
7570: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
7580: 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
7590: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31  pTable->nRef = 1
75a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  ;.  pTable->nRow
75b0: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
75c0: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
75d0: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
75e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
75f0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7600: 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ==0 );.  pParse-
7610: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61  >pNewTable = pTa
7620: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ble;..  /* If th
7630: 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  is is the magic 
7640: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
7650: 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75  table used by au
7660: 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a  toincrement,.  *
7670: 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  * then record a 
7680: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
7690: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
76a0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
76b0: 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61  ture.  ** so tha
76c0: 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e  t INSERT can fin
76d0: 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69  d the table easi
76e0: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
76f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7700: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28  OINCREMENT.  if(
7710: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
7720: 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65   && strcmp(zName
7730: 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
7740: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ce")==0 ){.    a
7750: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
7760: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
7770: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
7780: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7790: 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62  ->pSeqTab = pTab
77a0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
77b0: 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
77c0: 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74  ating the code t
77d0: 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20  hat will insert 
77e0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
77f0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53   into.  ** the S
7800: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
7810: 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72  le.  Note in par
7820: 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20  ticular that we 
7830: 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20  must go ahead.  
7840: 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ** and allocate 
7850: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
7860: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
7870: 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f  entry now.  Befo
7880: 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d  re any.  ** PRIM
7890: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
78a0: 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70  E keywords are p
78b0: 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65  arsed.  Those ke
78c0: 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73  ywords will caus
78d0: 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74  e.  ** indices t
78e0: 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64  o be created and
78f0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
7900: 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f  d must come befo
7910: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64  re the .  ** ind
7920: 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ices.  Hence, th
7930: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7940: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75  for the table mu
7950: 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
7960: 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20    ** now..  */. 
7970: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
7980: 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69  usy && (v = sqli
7990: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
79a0: 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  e))!=0 ){.    in
79b0: 74 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74  t addr1;.    int
79c0: 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20   fileFormat;.   
79d0: 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c   int reg1, reg2,
79e0: 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75   reg3;.    /* nu
79f0: 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50  llRow[] is an OP
7a00: 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67  _Record encoding
7a10: 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69   of a row contai
7a20: 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a  ning 5 NULLs */.
7a30: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7a40: 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20   char nullRow[] 
7a50: 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 6, 0, 0, 0, 
7a60: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69  0, 0 };.    sqli
7a70: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7a80: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
7a90: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7aa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7ab0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7ac0: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ae0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
7af0: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
7b00: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
7b10: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
7b20: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
7b30: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
7b40: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
7b50: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
7b60: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7b70: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7b80: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7b90: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7ba0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7bb0: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7bc0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7bd0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7bf0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
7c00: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
7c10: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
7c20: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
7c30: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
7c40: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64  (v, iDb);.    ad
7c50: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
7c60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
7c70: 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76  , reg3); VdbeCov
7c80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69  erage(v);.    fi
7c90: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
7ca0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
7cb0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
7cc0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
7cd0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
7ce0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
7cf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7d10: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7d20: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
7d30: 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20  fileFormat);.   
7d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7d60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
7d70: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e  EXT_ENCODING, EN
7d80: 43 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69  C(db));.    sqli
7d90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7da0: 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20  v, addr1);..    
7db0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7dc0: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7dd0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7de0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7df0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
7e00: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
7e10: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
7e20: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
7e30: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
7e40: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7e50: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7e60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7e70: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7e80: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7e90: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7ea0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7eb0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7ec0: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7ed0: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7ee0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7ef0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
7f00: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
7f10: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
7f20: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
7f30: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
7f40: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
7f50: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
7f60: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
7f70: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
7f80: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
7f90: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
7fa0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7fb0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7fc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7fd0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
7fe0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
7ff0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
8000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8010: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8020: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
8030: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8040: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
8050: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
8060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8070: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
8080: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
8090: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
80a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
80b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
80c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
80d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
80e0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
80f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8100: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
8110: 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c   6, reg3, 0, nul
8120: 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29  lRow, P4_STATIC)
8130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8140: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8150: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
8160: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8170: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8180: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81a0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
81b0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
81c0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
81d0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
81e0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
81f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8200: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8210: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8220: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8230: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8240: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
8250: 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f  Set properties o
8260: 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
8270: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d   based on the (m
8280: 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20  agical).** name 
8290: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  of the column..*
82a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
82b0: 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
82c0: 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  NS.void sqlite3C
82d0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
82e0: 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70  romName(Table *p
82f0: 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  Tab, Column *pCo
8300: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
8310: 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d  3_strnicmp(pCol-
8320: 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65  >zName, "__hidde
8330: 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  n__", 10)==0 ){.
8340: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8350: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49  gs |= COLFLAG_HI
8360: 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DDEN;.  }else if
8370: 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d  ( pTab && pCol!=
8380: 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70  pTab->aCol && (p
8390: 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73  Col[-1].colFlags
83a0: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
83b0: 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  N) ){.    pTab->
83c0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f  tabFlags |= TF_O
83d0: 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a  OOHidden;.  }.}.
83e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
83f0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
8400: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8410: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
8420: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
8430: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8440: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
8450: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
8460: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
8470: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
8480: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8490: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
84a0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
84b0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
84c0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
84d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
84e0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
84f0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
8500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8510: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
8520: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8530: 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  ame, Token *pTyp
8540: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
8550: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
8560: 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  *z;.  char *zTyp
8570: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
8580: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8590: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
85a0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
85b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
85c0: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
85d0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
85e0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
85f0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8600: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8610: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8620: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8630: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8640: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8650: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8660: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
8670: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8680: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8690: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
86a0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
86b0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  eturn;.  memcpy(
86c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
86d0: 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d  me->n);.  z[pNam
86e0: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  e->n] = 0;.  sql
86f0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
8700: 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71    zType = z + sq
8710: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
8720: 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   + 1;.  memcpy(z
8730: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8740: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 7a 54 79  pType->n);.  zTy
8750: 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30  pe[pType->n] = 0
8760: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8770: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8790: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
87a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
87b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
87c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
87d0: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
87e0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
87f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8800: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8810: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8820: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
8830: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
8840: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
8850: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
8860: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
8870: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
8880: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
8890: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
88a0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
88b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
88c0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
88d0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
88e0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
88f0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
8900: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
8910: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
8920: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
8930: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
8940: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
8950: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
8960: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
8970: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
8980: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
8990: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
89a0: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
89b0: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
89c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
89d0: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
89e0: 4f 42 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  OB'. */.    pCol
89f0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8a00: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
8a10: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8a20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8a30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8a40: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8a50: 54 79 70 65 28 7a 54 79 70 65 2c 20 26 70 43 6f  Type(zType, &pCo
8a60: 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 7d 0a 20  l->szEst);.  }. 
8a70: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50   p->nCol++;.  pP
8a80: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
8a90: 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f  Name.n = 0;.}../
8aa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8ab0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
8ac0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
8ad0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
8ae0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
8af0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8b00: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
8b10: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
8b20: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
8b30: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
8b40: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
8b50: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
8b60: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
8b70: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
8b80: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
8b90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8ba0: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
8bb0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
8bc0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
8bd0: 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  p;.  p = pParse-
8be0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
8bf0: 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
8c00: 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74  p->nCol<1) ) ret
8c10: 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70  urn;.  p->aCol[p
8c20: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c  ->nCol-1].notNul
8c30: 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  l = (u8)onError;
8c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
8c50: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
8c60: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
8c70: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
8c80: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
8c90: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
8ca0: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
8cb0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
8cc0: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
8cd0: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
8ce0: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
8cf0: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
8d00: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
8d10: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
8d20: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
8d30: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
8d40: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
8d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
8d60: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
8d70: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
8d80: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8d90: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
8da0: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
8db0: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
8dc0: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
8dd0: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
8de0: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
8df0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
8e00: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
8e10: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
8e20: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
8e30: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
8e60: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8e70: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
8e80: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
8e90: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8ea0: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
8eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8ec0: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
8ed0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8ee0: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
8ef0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8f00: 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27  F_BLOB.** 'REAL'
8f10: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8f20: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
8f30: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
8f40: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
8f50: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
8f60: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
8f70: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
8f80: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8f90: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
8fa0: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
8fb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
8fc0: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
8fd0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
8fe0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
8ff0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38  st char *zIn, u8
9000: 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32   *pszEst){.  u32
9010: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
9020: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9030: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
9040: 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30   char *zChar = 0
9050: 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20  ;..  if( zIn==0 
9060: 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 20 20  ) return aff;.  
9070: 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b  while( zIn[0] ){
9080: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20  .    h = (h<<8) 
9090: 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  + sqlite3UpperTo
90a0: 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66  Lower[(*zIn)&0xf
90b0: 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  f];.    zIn++;. 
90c0: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
90d0: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
90e0: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9100: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
9110: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
9120: 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20  XT;.      zChar 
9130: 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  = zIn;.    }else
9140: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
9150: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9160: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
9170: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
9180: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9190: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
91a0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
91b0: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
91c0: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
91d0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
91e0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
91f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
9200: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9210: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
9220: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
9230: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
9240: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
9250: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
9260: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
9270: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9280: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
9290: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
92a0: 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20  BLOB;.      if( 
92b0: 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43  zIn[0]=='(' ) zC
92c0: 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64  har = zIn;.#ifnd
92d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
92e0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
92f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9300: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
9310: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
9320: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
9330: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
9340: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
9350: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9360: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9370: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
9380: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
9390: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
93a0: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
93b0: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
93c0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
93d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
93e0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
93f0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
9400: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
9410: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
9420: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
9430: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
9440: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
9450: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9460: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9470: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9480: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
9490: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
94a0: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
94b0: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
94c0: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
94d0: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
94e0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
94f0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
9500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9510: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a    }..  /* If psz
9520: 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Est is not NULL,
9530: 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61   store an estima
9540: 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  te of the field 
9550: 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20  size.  The.  ** 
9560: 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c  estimate is scal
9570: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ed so that the s
9580: 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  ize of an intege
9590: 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66  r is 1.  */.  if
95a0: 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20  ( pszEst ){.    
95b0: 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f  *pszEst = 1;   /
95c0: 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69  * default size i
95d0: 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73  s approx 4 bytes
95e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c   */.    if( aff<
95f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9600: 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  IC ){.      if( 
9610: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
9620: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
9630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9640: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
9650: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
9660: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 20            int v 
9670: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
9680: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
9690: 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20  (zChar, &v);.   
96a0: 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34           v = v/4
96b0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
96c0: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
96d0: 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20  = 255;.         
96e0: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20     *pszEst = v; 
96f0: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
9700: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
9710: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
9720: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9730: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9740: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9750: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9770: 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20   *pszEst = 5;   
9780: 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43  /* BLOB, TEXT, C
9790: 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70  LOB -> r=5  (app
97a0: 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a  rox 20 bytes)*/.
97b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
97c0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
97d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
97e0: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
97f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
9800: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9810: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
9820: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
9830: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9840: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
9850: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
9860: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
9870: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
9880: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
9890: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
98a0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
98b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
98c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
98d0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
98e0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
98f0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
9900: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9910: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
9920: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
9930: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
9940: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
9950: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
9960: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
9970: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
9980: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9990: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
99a0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
99b0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
99c0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
99d0: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
99e0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
99f0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9a00: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64  (pSpan->pExpr, d
9a10: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
9a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9a30: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9a40: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
9a50: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
9a60: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
9a70: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
9a80: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
9a90: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  {.      /* A cop
9aa0: 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73  y of pExpr is us
9ab0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
9ac0: 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70  e original, as p
9ad0: 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20  Expr contains.  
9ae0: 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68      ** tokens th
9af0: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61  at point to vola
9b00: 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65  tile memory. The
9b10: 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65   'span' of the e
9b20: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20  xpression.      
9b30: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ** is required b
9b40: 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69  y pragma table_i
9b50: 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nfo..      */.  
9b60: 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20 20      Expr x;.    
9b70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9b80: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
9b90: 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  flt);.      mems
9ba0: 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&x, 0, sizeof
9bb0: 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f 70  (x));.      x.op
9bc0: 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20 20   = TK_SPAN;.    
9bd0: 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73    x.u.zToken = s
9be0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
9bf0: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
9c00: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9c30: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9c40: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9c50: 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66 74  );.      x.pLeft
9c60: 20 3d 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 3b   = pSpan->pExpr;
9c70: 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d  .      x.flags =
9c80: 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20   EP_Skip;.      
9c90: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
9ca0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9cb0: 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44   &x, EXPRDUP_RED
9cc0: 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  UCE);.      sqli
9cd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e  te3DbFree(db, x.
9ce0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  u.zToken);.    }
9cf0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
9d00: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70  prDelete(db, pSp
9d10: 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  an->pExpr);.}../
9d20: 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43  *.** Backwards C
9d30: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61 63  ompatibility Hac
9d40: 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72  k:.** .** Histor
9d50: 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66  ical versions of
9d60: 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64   SQLite accepted
9d70: 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75   strings as colu
9d80: 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69  mn names in.** i
9d90: 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41  ndexes and PRIMA
9da0: 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
9db0: 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45  ts and in UNIQUE
9dc0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45   constraints.  E
9dd0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
9de0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
9df0: 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49  yz(a,b,c,d,e,PRI
9e00: 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e  MARY KEY('a'),UN
9e10: 49 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c  IQUE('b','c' COL
9e20: 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20  LATE trim).**   
9e30: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61    CREATE INDEX a
9e40: 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64  bc ON xyz('c','d
9e50: 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41  ' DESC,'e' COLLA
9e60: 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b  TE nocase DESC);
9e70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67  .**.** This is g
9e80: 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72  oofy.  But to pr
9e90: 65 73 65 72 76 65 20 62 61 63 6b 77 61 72 64 73  eserve backwards
9ea0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
9eb0: 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a  e continue to.**
9ec0: 20 61 63 63 65 70 74 20 69 74 2e 20 20 54 68 69   accept it.  Thi
9ed0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
9ee0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e  he necessary con
9ef0: 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e  version.  It con
9f00: 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70  verts.** the exp
9f10: 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e  ression given in
9f20: 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72   its argument fr
9f30: 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69  om a TK_STRING i
9f40: 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69  nto a TK_ID.** i
9f50: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9f60: 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54   is just a TK_ST
9f70: 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74  RING with an opt
9f80: 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c  ional COLLATE cl
9f90: 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ause..** If the 
9fa0: 65 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  epxression is an
9fb0: 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
9fc0: 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65  n TK_STRING, the
9fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
9fe0: 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  * unchanged..*/.
9ff0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
a000: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78  te3StringToId(Ex
a010: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
a020: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
a030: 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  {.    p->op = TK
a040: 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _ID;.  }else if(
a050: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41   p->op==TK_COLLA
a060: 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e  TE && p->pLeft->
a070: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
a080: 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  .    p->pLeft->o
a090: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d  p = TK_ID;.  }.}
a0a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
a0b0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
a0c0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
a0d0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
a0e0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
a0f0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
a100: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
a110: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
a120: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
a130: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
a140: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
a150: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
a160: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
a170: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
a180: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
a190: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
a1a0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
a1b0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
a1c0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
a1d0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
a1e0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
a1f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
a200: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
a210: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
a220: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
a230: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
a240: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
a250: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
a260: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
a270: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
a280: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
a290: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
a2a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
a2b0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
a2c0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
a2d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
a2e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a2f0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
a300: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
a310: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
a320: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
a330: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
a340: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
a350: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
a360: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
a370: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
a380: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
a390: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
a3a0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
a3b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a3c0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
a3d0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
a3e0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
a3f0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
a400: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a410: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a420: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
a430: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
a440: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
a450: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
a460: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
a470: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
a480: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
a490: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
a4a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
a4b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
a4c0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
a4d0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
a4e0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
a4f0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
a500: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
a510: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
a520: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a530: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a540: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
a550: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
a560: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
a570: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
a580: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
a590: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
a5a0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
a5b0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
a5c0: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b  HasPrimaryKey ){
a5d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a5e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
a5f0: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
a600: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
a610: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
a620: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
a630: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
a640: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
a650: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
a660: 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79  |= TF_HasPrimary
a670: 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  Key;.  if( pList
a680: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
a690: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
a6a0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
a6b0: 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20  [iCol].colFlags 
a6c0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
a6d0: 45 59 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  EY;.    zName = 
a6e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a6f0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 54 65 72  .zName;.    nTer
a700: 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 1;.  }else{.
a710: 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73      nTerm = pLis
a720: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f  t->nExpr;.    fo
a730: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
a740: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
a750: 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74   *pCExpr = sqlit
a760: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
a770: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
a780: 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  xpr);.      asse
a790: 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b  rt( pCExpr!=0 );
a7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
a7b0: 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29  ringToId(pCExpr)
a7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45 78  ;.      if( pCEx
a7d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
a7e0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
a7f0: 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43  har *zCName = pC
a800: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
a810: 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c          for(iCol
a820: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
a830: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
a840: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a850: 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d  te3StrICmp(zCNam
a860: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
a870: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
a880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61  .            pTa
a890: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f  b->aCol[iCol].co
a8a0: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a8b0: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20  G_PRIMKEY;.     
a8c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
a8d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a8e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
a8f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
a910: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a920: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31  }.  if( nTerm==1
a930: 0a 20 20 20 26 26 20 7a 4e 61 6d 65 0a 20 20 20  .   && zName.   
a940: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
a950: 70 28 73 71 6c 69 74 65 33 53 74 72 4e 65 78 74  p(sqlite3StrNext
a960: 28 7a 4e 61 6d 65 29 2c 20 22 49 4e 54 45 47 45  (zName), "INTEGE
a970: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
a980: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
a990: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
a9a0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
a9b0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
a9c0: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
a9d0: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
a9e0: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
a9f0: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
aa00: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
aa10: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
aa20: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20  toincrement;.   
aa30: 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61   if( pList ) pPa
aa40: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
aa50: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  r = pList->a[0].
aa60: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c  sortOrder;.  }el
aa70: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
aa80: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
aa90: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
aaa0: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
aab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
aac0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
aad0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
aae0: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
aaf0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
ab00: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
ab10: 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20  else{.    Index 
ab20: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
ab30: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
ab40: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
ab50: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
ab60: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
ab80: 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a   sortOrder, 0);.
ab90: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
aba0: 20 20 20 70 2d 3e 69 64 78 54 79 70 65 20 3d 20     p->idxType = 
abb0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
abc0: 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 7d  RIMARYKEY;.    }
abd0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
abe0: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
abf0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
ac00: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
ac10: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
ac20: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
ac30: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
ac40: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
ac50: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
ac60: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
ac70: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
ac80: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
ac90: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
aca0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
acb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
acc0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
acd0: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
ace0: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
acf0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  sion */.){.#ifnd
ad00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ad10: 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54  HECK.  Table *pT
ad20: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
ad30: 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65  wTable;.  sqlite
ad40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ad50: 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  db;.  if( pTab &
ad60: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
ad70: 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65  AB.   && !sqlite
ad80: 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79  3BtreeIsReadonly
ad90: 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69  (db->aDb[db->ini
ada0: 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b  t.iDb].pBt).  ){
adb0: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
adc0: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
add0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
ade0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
adf0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
ae00: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
ae10: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
ae20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ae30: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
ae40: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
ae50: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
ae60: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
ae70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
ae80: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
ae90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
aea0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
aeb0: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
aec0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
aed0: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
aee0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
aef0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
af00: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
af10: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
af20: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
af30: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
af40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
af50: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
af60: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
af70: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
af80: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
af90: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
afa0: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
afb0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
afc0: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
afd0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
afe0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
aff0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
b000: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
b010: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
b020: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
b030: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
b040: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
b050: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
b060: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
b070: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
b080: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
b090: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
b0a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b0b0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
b0c0: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
b0d0: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
b0e0: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
b0f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
b100: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
b110: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
b120: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
b130: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
b140: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
b150: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
b160: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
b170: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
b180: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
b190: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
b1a0: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
b1b0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
b1c0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
b1d0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
b1e0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
b1f0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
b200: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
b210: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
b220: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
b230: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
b240: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
b250: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
b260: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
b270: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
b280: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
b290: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
b2a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b2b0: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
b2c0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
b2d0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
b2e0: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
b2f0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
b300: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
b310: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
b320: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
b330: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
b340: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
b350: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
b360: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
b370: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
b380: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
b390: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
b3a0: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
b3b0: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
b3c0: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
b3d0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
b3e0: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
b3f0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
b400: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
b410: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
b420: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
b430: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
b440: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
b450: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
b460: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
b470: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
b480: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
b490: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
b4a0: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
b4b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
b4c0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
b4d0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
b4e0: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
b4f0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
b500: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b510: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
b520: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
b530: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
b540: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
b550: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
b560: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
b570: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
b580: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
b590: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
b5a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b5b0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
b5c0: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
b5d0: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
b5e0: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
b5f0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
b600: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
b610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
b620: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
b630: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b640: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
b650: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
b660: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
b670: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
b680: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b690: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
b6a0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b6b0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
b6c0: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
b6d0: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
b6e0: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
b6f0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
b700: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
b710: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b720: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
b730: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
b740: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
b750: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b760: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
b770: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
b780: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
b790: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
b7a0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
b7b0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
b7c0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
b7d0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
b7e0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
b7f0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
b800: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
b810: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
b820: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
b830: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
b840: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
b850: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
b860: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
b870: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
b880: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
b890: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
b8a0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
b8b0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
b8c0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
b8d0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
b8e0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
b8f0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
b900: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
b910: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
b920: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
b930: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
b940: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
b950: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
b960: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
b970: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
b980: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
b990: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
b9a0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
b9b0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
b9c0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
b9d0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
b9e0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
b9f0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
ba00: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
ba10: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
ba20: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
ba30: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
ba40: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
ba50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ba60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
ba70: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ba80: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
ba90: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
baa0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
bab0: 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33   0) );.  sqlite3
bac0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
bad0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
bae0: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
baf0: 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20  RSION, .        
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
bb10: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
bb20: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
bb30: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
bb40: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
bb50: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
bb60: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
bb70: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
bb80: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
bb90: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
bba0: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
bbb0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
bbc0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
bbd0: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
bbe0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
bbf0: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
bc00: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
bc10: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
bc20: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
bc30: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
bc40: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
bc50: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
bc60: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
bc70: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
bc80: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
bc90: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
bca0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
bcb0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
bcc0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
bcd0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
bce0: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
bcf0: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
bd00: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
bd10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bd20: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
bd30: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
bd40: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
bd50: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
bd60: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
bd70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
bd80: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
bd90: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
bda0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
bdb0: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
bdc0: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
bdd0: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
bde0: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
bdf0: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
be00: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
be10: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
be20: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
be30: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
be40: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
be50: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
be60: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
be70: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
be80: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
be90: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
bea0: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
beb0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
bec0: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
bed0: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
bee0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
bef0: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
bf00: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
bf10: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
bf20: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
bf30: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
bf40: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
bf50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
bf60: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
bf70: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
bf80: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
bf90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bfa0: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
bfb0: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
bfc0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
bfd0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
bfe0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
bff0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
c000: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
c010: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
c020: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
c030: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
c040: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
c050: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
c060: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
c070: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ]).            |
c080: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
c090: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
c0a0: 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20  =TK_ID.         
c0b0: 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21     || zIdent[j]!
c0c0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
c0d0: 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e  | j==0;..  if( n
c0e0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c0f0: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
c100: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
c110: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
c120: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
c130: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
c140: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
c150: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
c160: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c170: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
c180: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
c190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c1a0: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
c1b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
c1c0: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
c1d0: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
c1e0: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
c1f0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
c200: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
c210: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
c220: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
c230: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
c240: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
c250: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
c260: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
c270: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
c280: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
c290: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
c2a0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
c2b0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
c2c0: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
c2d0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
c2e0: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
c2f0: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
c300: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
c310: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
c320: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
c330: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
c340: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
c350: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
c360: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
c370: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
c380: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
c390: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
c3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
c3b0: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
c3c0: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
c3d0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
c3e0: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
c3f0: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
c400: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
c410: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
c420: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
c430: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
c440: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
c450: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c460: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c470: 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45  f(n, zStmt, "CRE
c480: 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20  ATE TABLE ");.  
c490: 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  k = sqlite3Strle
c4a0: 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64  n30(zStmt);.  id
c4b0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
c4c0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a  , p->zName);.  z
c4d0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b  Stmt[k++] = '(';
c4e0: 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61  .  for(pCol=p->a
c4f0: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
c500: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
c510: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
c520: 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
c530: 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20   azType[] = {.  
c540: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c550: 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22  AFF_BLOB    */ "
c560: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
c570: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
c580: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
c590: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c5a0: 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20  FF_NUMERIC */ " 
c5b0: 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  NUM",.        /*
c5c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
c5d0: 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20  GER */ " INT",. 
c5e0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c5f0: 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20  _AFF_REAL    */ 
c600: 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20  " REAL".    };. 
c610: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
c620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
c630: 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e;..    sqlite3_
c640: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
c650: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
c660: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
c670: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
c680: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
c690: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
c6a0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
c6b0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
c6c0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
c6d0: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
c6e0: 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a  FF_BLOB >= 0 );.
c6f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
c700: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
c710: 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72  E_AFF_BLOB < Arr
c720: 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29  aySize(azType) )
c730: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c740: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c750: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
c760: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c770: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c780: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
c790: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c7a0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c7b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
c7c0: 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74  ERIC );.    test
c7d0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
c7e0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c7f0: 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
c800: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c810: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c820: 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20  _AFF_REAL );.   
c830: 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a   .    zType = az
c840: 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e  Type[pCol->affin
c850: 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46  ity - SQLITE_AFF
c860: 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20  _BLOB];.    len 
c870: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c880: 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73  0(zType);.    as
c890: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
c8a0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c8b0: 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20  _BLOB .         
c8c0: 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69     || pCol->affi
c8d0: 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66  nity==sqlite3Aff
c8e0: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
c8f0: 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70   0) );.    memcp
c900: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
c910: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
c920: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
c930: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
c940: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c950: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
c960: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
c970: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
c980: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
c990: 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
c9a0: 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e  to hold N column
c9b0: 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e  s total.  Return
c9c0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
c9d0: 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c   success and SQL
c9e0: 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20  ITE_NOMEM on an 
c9f0: 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  OOM error..*/.st
ca00: 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49  atic int resizeI
ca10: 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74  ndexObject(sqlit
ca20: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
ca30: 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63  Idx, int N){.  c
ca40: 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69  har *zExtra;.  i
ca50: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
ca60: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e  pIdx->nColumn>=N
ca70: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ca80: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
ca90: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d  Idx->isResized==
caa0: 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28  0 );.  nByte = (
cab0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20  sizeof(char*) + 
cac0: 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29  sizeof(i16) + 1)
cad0: 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73  *N;.  zExtra = s
cae0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
caf0: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
cb00: 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29   if( zExtra==0 )
cb10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cb20: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
cb30: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cb40: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
cb50: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
cb60: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cb70: 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
cb80: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
cb90: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
cba0: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
cbb0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cbc0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
cbd0: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
cbe0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cbf0: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
cc00: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
cc10: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
cc20: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
cc30: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
cc40: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
cc50: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cc60: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
cc70: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
cc80: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
cc90: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
cca0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
ccb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ccc0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
ccd0: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
cce0: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
ccf0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
cd00: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
cd10: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
cd20: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
cd30: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
cd40: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
cd50: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
cd60: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
cd70: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
cd80: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
cd90: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
cda0: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
cdb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
cdc0: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
cdd0: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
cde0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
cdf0: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
ce00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
ce10: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
ce20: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
ce30: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
ce40: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
ce50: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
ce60: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
ce70: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
ce80: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
ce90: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
cea0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
ceb0: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
cec0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
ced0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
cee0: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
cef0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
cf00: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
cf10: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
cf20: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
cf30: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
cf40: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
cf50: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
cf60: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
cf70: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
cf80: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
cf90: 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20  true if value x 
cfa0: 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20  is found any of 
cfb0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
cfc0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
cfd0: 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ].*/.static int 
cfe0: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
cff0: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
d000: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
d010: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
d020: 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43  0 ) if( x==*(aiC
d030: 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31  ol++) ) return 1
d040: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
d050: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d060: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
d070: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
d080: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
d090: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
d0a0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
d0b0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
d0c0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
d0d0: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
d0e0: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
d0f0: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
d100: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
d110: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
d120: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
d130: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
d140: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
d150: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d160: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
d170: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
d180: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
d190: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f  *.**     (1)  Co
d1a0: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
d1b0: 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e  ateTable into an
d1c0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e   OP_CreateIndex.
d1d0: 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20    There is.**   
d1e0: 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20         no rowid 
d1f0: 62 74 72 65 65 20 66 6f 72 20 61 20 57 49 54 48  btree for a WITH
d200: 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74  OUT ROWID.  Inst
d210: 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63  ead, the canonic
d220: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64  al.**          d
d230: 61 74 61 20 73 74 6f 72 61 67 65 20 69 73 20 61  ata storage is a
d240: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
d250: 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32  btree..**     (2
d260: 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72  )  Bypass the cr
d270: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  eation of the sq
d280: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d290: 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20  e entry.**      
d2a0: 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d      for the PRIM
d2b0: 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70  ARY KEY as the p
d2c0: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
d2d0: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
d2e0: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
d2f0: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
d300: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
d310: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
d320: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
d330: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
d340: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
d350: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
d360: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
d370: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
d380: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
d390: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
d3a0: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
d3b0: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d3c0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d3d0: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d3e0: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d3f0: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
d400: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d410: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
d420: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d430: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d440: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d450: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d460: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d470: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d480: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d490: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d4a0: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d4b0: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d4c0: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d4d0: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d4e0: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d4f0: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d500: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d510: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d520: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d530: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d540: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d550: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d560: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
d570: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d580: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d590: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d5a0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d5b0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d5c0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d5d0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d5e0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d5f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d600: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d610: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d620: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d630: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d640: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d650: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d660: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d670: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d680: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65  e into an OP_Cre
d690: 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e  ateIndex opcode.
d6a0: 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a    The index.  **
d6b0: 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65   created will be
d6c0: 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59  come the PRIMARY
d6d0: 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   KEY index..  */
d6e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d6f0: 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20  ddrCrTab ){.    
d700: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20  assert( v );.   
d710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d720: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 61 72  geOpcode(v, pPar
d730: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 4f  se->addrCrTab, O
d740: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 29 3b 0a  P_CreateIndex);.
d750: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d760: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d770: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
d780: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
d790: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
d7a0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
d7b0: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
d7c0: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
d7d0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
d7e0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
d7f0: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
d800: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
d810: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
d820: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
d830: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
d840: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
d850: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
d860: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
d870: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
d880: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
d890: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d8a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
d8b0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
d8c0: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
d8d0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
d8e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
d8f0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
d900: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
d910: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
d920: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
d930: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
d940: 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71   );.    pPk = sq
d950: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
d960: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
d970: 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b  , pList, pTab->k
d980: 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c  eyConf, 0, 0, 0,
d990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b   0);.    if( pPk
d9a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d9b0: 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d    pPk->idxType =
d9c0: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
d9d0: 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20  PRIMARYKEY;.    
d9e0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
d9f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
da00: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
da10: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
da20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61 73  );..    /* Bypas
da30: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
da40: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
da50: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
da60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
da70: 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79    ** table entry
da80: 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72  . This is only r
da90: 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72 65  equired if curre
daa0: 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20  ntly generating 
dab0: 56 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64 65  VDBE.    ** code
dac0: 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41   for a CREATE TA
dad0: 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61  BLE (not when pa
dae0: 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72  rsing one as par
daf0: 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 20  t of reading.   
db00: 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73   ** a database s
db10: 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20 20  chema).  */.    
db20: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 61  if( v ){.      a
db30: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
db40: 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  busy==0 );.     
db50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
db60: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d  geOpcode(v, pPk-
db70: 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b  >tnum, OP_Goto);
db80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
db90: 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c     ** Remove all
dba0: 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
dbb0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d  ns from the PRIM
dbc0: 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78  ARY KEY.  For ex
dbd0: 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20  ample, change.  
dbe0: 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45    ** "PRIMARY KE
dbf0: 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c  Y(a,b,a,b,c,b,c,
dc00: 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50  d)" into just "P
dc10: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63  RIMARY KEY(a,b,c
dc20: 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20  ,d)".  Later.   
dc30: 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73   ** code assumes
dc40: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
dc50: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70   contains no rep
dc60: 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  eated columns.. 
dc70: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
dc80: 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79  j=1; i<pPk->nKey
dc90: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
dca0: 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
dcb0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
dcc0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
dcd0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ]) ){.        pP
dce0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20  k->nColumn--;.  
dcf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd00: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
dd10: 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  [j++] = pPk->aiC
dd20: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
dd30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d  }.    }.    pPk-
dd40: 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20  >nKeyCol = j;.  
dd50: 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  }.  pPk->isCover
dd60: 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ing = 1;.  asser
dd70: 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e  t( pPk!=0 );.  n
dd80: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
dd90: 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  l;..  /* Make su
dda0: 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  re every column 
ddb0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ddc0: 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e 20  EY is NOT NULL. 
ddd0: 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20 64   (Except,.  ** d
dde0: 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74 68  o not enforce th
ddf0: 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  is for imposter 
de00: 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69 66  tables.) */.  if
de10: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
de20: 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20  sterTable ){.   
de30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
de40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54 61   i++){.      pTa
de50: 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43  b->aCol[pPk->aiC
de60: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c  olumn[i]].notNul
de70: 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  l = OE_Abort;.  
de80: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e 69    }.    pPk->uni
de90: 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  qNotNull = 1;.  
dea0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  }..  /* The root
deb0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
dec0: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
ded0: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
dee0: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
def0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
df00: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
df10: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
df20: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
df30: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
df40: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
df50: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
df60: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
df70: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
df80: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
df90: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
dfa0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
dfb0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
dfc0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
dfd0: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73  nt n;.    if( Is
dfe0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
dff0: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
e000: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  ;.    for(i=n=0;
e010: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e020: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e030: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e040: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e050: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e060: 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  i]) ) n++;.    }
e070: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
e080: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
e090: 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
e0a0: 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
e0b0: 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
e0c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
e0d0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
e0e0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
e0f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
e100: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
e110: 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
e120: 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
e130: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
e140: 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
e150: 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
e160: 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75      if( !hasColu
e170: 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  mn(pIdx->aiColum
e180: 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n, pIdx->nKeyCol
e190: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e1a0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e1b0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
e1c0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
e1d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
e1e0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
e1f0: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
e200: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
e210: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
e220: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
e230: 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  umn>=pIdx->nKeyC
e240: 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  ol+n );.    asse
e250: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e260: 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  n>=j );.  }..  /
e270: 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20  * Add all table 
e280: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
e290: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
e2a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c  .  */.  if( nPk<
e2b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
e2c0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e2d0: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c  xObject(db, pPk,
e2e0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72   pTab->nCol) ) r
e2f0: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
e300: 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61  =0, j=nPk; i<pTa
e310: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
e320: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e330: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
e340: 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20  n, j, i) ){.    
e350: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50      assert( j<pP
e360: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  k->nColumn );.  
e370: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e380: 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20  umn[j] = i;.    
e390: 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b      pPk->azColl[
e3a0: 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  j] = sqlite3StrB
e3b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a  INARY;.        j
e3c0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e3d0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
e3e0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
e3f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
e400: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
e410: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
e420: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
e430: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
e440: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e450: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
e460: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
e470: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
e480: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
e490: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e4a0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
e4b0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
e4c0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
e4d0: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
e4e0: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
e4f0: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
e500: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
e510: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
e520: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
e530: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
e540: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
e550: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
e560: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
e570: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
e580: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
e590: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
e5a0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
e5b0: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
e5c0: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
e5d0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
e5e0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
e5f0: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
e600: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
e610: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
e620: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
e630: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
e640: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
e650: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
e660: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
e670: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
e680: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
e690: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
e6a0: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
e6b0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
e6c0: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
e6d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
e6e0: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
e6f0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
e700: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
e710: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
e720: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
e730: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
e740: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
e750: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
e760: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
e770: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
e780: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
e790: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
e7a0: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
e7b0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
e7c0: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
e7d0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
e7e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e800: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
e810: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
e820: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
e830: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
e840: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
e850: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
e860: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
e870: 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
e880: 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
e890: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
e8a0: 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8c0: 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
e8d0: 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
e8e0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e8f0: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
e900: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
e910: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
e920: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
e930: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
e940: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
e950: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
e960: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e970: 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
e980: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e990: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
e9c0: 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
e9d0: 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
e9e0: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
e9f0: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
ea00: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
ea10: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
ea20: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
ea30: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ct==0 ){.    ret
ea40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
ea50: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
ea60: 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50  iled );.  p = pP
ea70: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ea80: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
ea90: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
eaa0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
eab0: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
eac0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
ead0: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
eae0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
eaf0: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
eb00: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
eb10: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
eb20: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
eb30: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
eb40: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
eb50: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
eb60: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
eb70: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
eb80: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
eb90: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
eba0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
ebb0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
ebc0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
ebd0: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
ebe0: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
ebf0: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
ec00: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
ec10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
ec20: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ec30: 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65  er is 1, that me
ec40: 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20  ans this is the 
ec50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
ec60: 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ** table itself.
ec70: 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61    So mark it rea
ec80: 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  d-only..  */.  i
ec90: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
eca0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
ecb0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
ecc0: 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74  um;.    if( p->t
ecd0: 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46  num==1 ) p->tabF
ece0: 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f  lags |= TF_Reado
ecf0: 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  nly;.  }..  /* S
ed00: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
ed10: 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  g for WITHOUT RO
ed20: 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20  WID Tables */.  
ed30: 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46  if( tabOpts & TF
ed40: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  _WithoutRowid ){
ed50: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
ed60: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
ed70: 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20  ncrement) ){.   
ed80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ed90: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
eda0: 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d       "AUTOINCREM
edb0: 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ENT not allowed 
edc0: 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  on WITHOUT ROWID
edd0: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
ede0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
edf0: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
ee00: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
ee10: 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  aryKey)==0 ){.  
ee20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ee30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49  Msg(pParse, "PRI
ee40: 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67  MARY KEY missing
ee50: 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70   on table %s", p
ee60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
ee70: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
ee80: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
ee90: 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e  houtRowid | TF_N
eea0: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
eeb0: 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69       convertToWi
eec0: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
eed0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
eee0: 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73  }.  }..  iDb = s
eef0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ef00: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
ef10: 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
ef20: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
ef30: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
ef40: 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
ef50: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
ef60: 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
ef70: 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
ef80: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
ef90: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
efa0: 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73  pParse, p, NC_Is
efb0: 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68  Check, 0, p->pCh
efc0: 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eck);.  }.#endif
efd0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
efe0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
eff0: 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  */..  /* Estimat
f000: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f  e the average ro
f010: 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74  w size for the t
f020: 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c  able and for all
f030: 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73   implied indices
f040: 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61   */.  estimateTa
f050: 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66  bleWidth(p);.  f
f060: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
f070: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f080: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f090: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
f0a0: 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20  th(pIdx);.  }.. 
f0b0: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
f0c0: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
f0d0: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
f0e0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
f0f0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
f100: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
f110: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
f120: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f130: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
f140: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
f150: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
f160: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
f170: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
f180: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
f190: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
f1a0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
f1b0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
f1c0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
f1d0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
f1e0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
f1f0: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
f200: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
f210: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
f220: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
f230: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
f240: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
f250: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
f260: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
f270: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
f280: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f290: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
f2a0: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
f2b0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
f2c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f2d0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20  OP_Close, 0);.. 
f2e0: 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e     /* .    ** In
f2f0: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66  itialize zType f
f300: 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  or the new view 
f310: 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  or table..    */
f320: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
f330: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
f340: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
f350: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
f360: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
f370: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
f380: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
f390: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
f3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
f3b0: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
f3c0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
f3d0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
f3e0: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
f3f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
f400: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
f410: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
f420: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
f430: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
f440: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
f450: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
f460: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
f470: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
f480: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
f490: 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67   table is in reg
f4a0: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
f4b0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  gRoot..    **.  
f4c0: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
f4d0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
f4e0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
f4f0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
f500: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
f510: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
f520: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
f530: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
f540: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
f550: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
f560: 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
f570: 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68  ** A shared-cach
f580: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
f590: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
f5a0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77  write to the new
f5b0: 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61   table,.    ** a
f5c0: 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  s a schema-lock 
f5d0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
f5e0: 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  y been obtained 
f5f0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69  to create it. Si
f600: 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68  nce.    ** a sch
f610: 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65  ema-lock exclude
f620: 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61  s all other data
f630: 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20  base users, the 
f640: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64  write-lock would
f650: 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e  .    ** be redun
f660: 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dant..    */.   
f670: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
f680: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
f690: 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65   dest;    /* Whe
f6a0: 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68  re the SELECT sh
f6b0: 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c  ould store resul
f6c0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
f6d0: 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20  regYield;       
f6e0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
f6f0: 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65  ing co-routine e
f700: 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20  ntry-point */.  
f710: 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
f720: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
f730: 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
f740: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
f750: 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  gRec;         /*
f760: 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20   A record to be 
f770: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20  insert into the 
f780: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  new table */.   
f790: 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b     int regRowid;
f7a0: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
f7b0: 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  of the next row 
f7c0: 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20  to insert */.   
f7d0: 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f     int addrInsLo
f7e0: 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  op;    /* Top of
f7f0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e   the loop for in
f800: 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  serting rows */.
f810: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
f820: 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74  lTab;     /* A t
f830: 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69  able that descri
f840: 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72  bes the SELECT r
f850: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20  esults */..     
f860: 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50   regYield = ++pP
f870: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f880: 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61    regRec = ++pPa
f890: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f8a0: 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50   regRowid = ++pP
f8b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f8c0: 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d    assert(pParse-
f8d0: 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20  >nTab==1);.     
f8e0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
f8f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
f900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f910: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
f920: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
f930: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
f940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f950: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
f960: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
f970: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
f980: 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  2;.      addrTop
f990: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f9a0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
f9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f9c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f9d0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
f9e0: 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72  egYield, 0, addr
f9f0: 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Top);.      sqli
fa00: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
fa10: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
fa20: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
fa30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa40: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
fa50: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
fa60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fa70: 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
fa80: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
fa90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
faa0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
fab0: 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28   - 1);.      if(
fac0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
fad0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53  return;.      pS
fae0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
faf0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
fb00: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fb10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
fb20: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
fb30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fb40: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
fb50: 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53      p->nCol = pS
fb60: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
fb70: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
fb80: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
fb90: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
fba0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  = 0;.      pSelT
fbb0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
fbd0: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
fbe0: 61 62 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49  ab);.      addrI
fbf0: 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
fc00: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fc10: 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
fc20: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
fc30: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fc40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
fc60: 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
fc70: 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
fc80: 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
fc90: 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
fca0: 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
fcb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fcc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
fcd0: 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
fce0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fcf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fd00: 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
fd10: 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
fd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd30: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
fd40: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
fd50: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fd60: 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
fd70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fd80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fd90: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
fda0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
fdb0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
fdc0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
fdd0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
fde0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
fdf0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
fe00: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
fe10: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
fe20: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
fe30: 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
fe40: 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
fe50: 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
fe60: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
fe70: 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
fe80: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
fe90: 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
fea0: 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
feb0: 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
fec0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
fed0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
fee0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
fef0: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
ff00: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
ff10: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
ff20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ff30: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
ff40: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
ff50: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
ff60: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
ff70: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
ff80: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
ff90: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
ffa0: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
ffb0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
ffc0: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
ffd0: 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
ffe0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
fff0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10000 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
10010 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
10020 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
10030 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
10040 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
10050 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
10060 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
10070 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
10080 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
10090 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
100a0 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
100b0 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
100c0 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
100d0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
100e0 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
100f0 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
10100 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
10110 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10120 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
10130 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
10140 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
10150 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
10160 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
10170 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
10180 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
10190 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
101a0 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
101b0 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
101c0 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
101d0 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
101e0 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
101f0 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c      if( p->tabFl
10200 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10210 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
10220 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
10230 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61  Db[iDb];.      a
10240 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
10250 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
10260 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
10270 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
10280 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
10290 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
102a0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
102b0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
102c0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
102d0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
102e0 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
102f0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
10300 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
10310 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
10320 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
10330 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
10340 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
10350 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
10360 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
10370 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
10380 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
10390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
103a0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62  3MPrintf(db, "tb
103b0 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  l_name='%q' AND 
103c0 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
103d0 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  , p->zName));.  
103e0 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
103f0 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
10400 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
10410 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
10420 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
10430 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
10440 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
10450 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20  Old;.    Schema 
10460 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
10470 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
10480 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
10490 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
104a0 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c  b, 0) );.    pOl
104b0 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
104c0 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
104d0 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
104e0 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
104f0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
10500 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
10510 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
10520 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
10530 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
10540 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10550 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
10560 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10570 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
10580 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
10590 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
105a0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
105b0 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
105c0 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
105d0 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
105e0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
105f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
10600 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
10610 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
10620 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
10630 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
10640 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
10650 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
10660 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
10670 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
10680 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
10690 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
106a0 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
106b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
106c0 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
106d0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
106e0 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
106f0 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
10700 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
10710 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10720 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10730 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
10740 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
10750 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
10760 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
10770 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
10780 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
10790 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
107a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
107b0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
107c0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
107d0 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
107e0 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
107f0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
10800 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
10810 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
10820 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
10830 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
10840 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
10850 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
10860 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
10870 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
10880 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10890 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
108a0 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
108b0 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
108c0 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
108d0 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
108e0 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
108f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10900 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
10910 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
10920 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
10930 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
10940 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
10950 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
10960 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
10970 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
10980 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
10990 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
109a0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
109b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
109c0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
109d0 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
109e0 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
109f0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
10a00 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
10a10 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10a20 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
10a30 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
10a40 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10a50 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
10a60 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
10a70 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
10a80 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
10a90 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
10aa0 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
10ab0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
10ac0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
10ad0 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
10ae0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
10af0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
10b00 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
10b10 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
10b20 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
10b30 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
10b40 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
10b50 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
10b60 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
10b70 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10b80 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
10b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
10ba0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
10bb0 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
10bc0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
10bd0 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
10be0 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
10bf0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
10c00 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
10c10 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
10c20 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
10c30 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
10c40 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
10c50 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
10c60 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
10c70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
10c80 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
10c90 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
10ca0 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
10cb0 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
10cc0 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
10cd0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
10ce0 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
10cf0 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
10d00 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
10d10 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
10d20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
10d30 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
10d40 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
10d50 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
10d60 45 29 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20  E);.  p->pCheck 
10d70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
10d80 74 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73  tDup(db, pCNames
10d90 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
10da0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
10db0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
10dc0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
10dd0 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  l;..  /* Locate 
10de0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
10df0 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
10e00 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
10e10 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
10e20 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
10e30 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
10e40 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  astToken;.  asse
10e50 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  rt( sEnd.z[0]!=0
10e60 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
10e70 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
10e80 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
10e90 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
10ea0 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
10eb0 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
10ec0 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
10ed0 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
10ee0 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
10ef0 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
10f00 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
10f10 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
10f20 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
10f30 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
10f40 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
10f50 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
10f60 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
10f70 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
10f80 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
10f90 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
10fa0 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
10fb0 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
10fc0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
10fd0 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
10fe0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
10ff0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
11000 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
11010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11020 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
11030 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
11040 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
11050 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11060 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11070 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
11080 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
11090 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
110a0 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
110b0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
110c0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
110d0 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
110e0 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
110f0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
11100 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
11110 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
11120 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
11130 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
11140 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
11150 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
11160 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
11170 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
11180 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
11190 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
111a0 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
111b0 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
111c0 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
111d0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
111e0 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
111f0 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
11200 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
11210 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
11220 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
11230 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11240 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
11250 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
11260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11270 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
11280 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11290 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
112a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
112b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
112c0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
112d0 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
112e0 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71  c errors */.  sq
112f0 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
11300 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
11310 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
11320 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  */..  assert( pT
11330 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
11340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11350 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
11360 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
11370 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
11380 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
11390 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
113a0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
113b0 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
113c0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
113d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
113e0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
113f0 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
11400 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
11410 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
11420 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
11430 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
11440 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
11450 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
11460 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
11470 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
11480 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
11490 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
114a0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
114b0 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
114c0 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
114d0 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
114e0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
114f0 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
11500 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
11510 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
11520 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
11530 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
11540 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
11550 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
11560 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
11570 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
11580 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
11590 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
115a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
115b0 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
115c0 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
115d0 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
115e0 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
115f0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
11600 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
11610 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
11620 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
11630 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
11640 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
11650 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11660 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
11670 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
11680 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
11690 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
116a0 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
116b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
116c0 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
116d0 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
116e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
116f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11700 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
11710 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
11720 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
11730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
11740 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
11750 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
11760 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
11770 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
11780 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
11790 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
117a0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
117b0 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
117c0 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
117d0 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
117e0 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
117f0 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
11800 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
11810 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
11820 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
11830 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
11840 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
11850 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
11860 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
11870 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
11880 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
11890 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
118a0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
118b0 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
118c0 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
118d0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
118e0 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
118f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11900 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11910 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
11920 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
11930 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
11940 69 73 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 73 71  isable++;.    sq
11950 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
11960 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
11970 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c   pTable->pCheck,
11980 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20   &pTable->nCol, 
119b0 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a  &pTable->aCol);.
119c0 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
119d0 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 20  e.bDisable--;.  
119e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 20  }else{.    pSel 
119f0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
11a00 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
11a10 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
11a20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
11a30 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
11a40 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
11a50 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
11a60 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
11a70 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  el->pSrc);.     
11a80 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
11a90 2d 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f  -1;.      db->lo
11aa0 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
11ab0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
11ac0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11ad0 41 54 49 4f 4e 0a 20 20 20 20 20 20 78 41 75 74  ATION.      xAut
11ae0 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
11af0 20 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d       db->xAuth =
11b00 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
11b10 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
11b20 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
11b30 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
11b40 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
11b50 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  uth;.#else.     
11b60 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
11b70 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11b80 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11b90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
11ba0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
11bb0 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 20 20 20 20  isable--;.      
11bc0 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
11bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
11be0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Tab ){.        a
11bf0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
11c00 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
11c10 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11c20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
11c30 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
11c40 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
11c50 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
11c60 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
11c70 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
11c80 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
11c90 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
11ca0 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
11cb0 61 62 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ab);.        ass
11cc0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
11cd0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
11ce0 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  0, pTable->pSche
11cf0 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ma) );.      }el
11d00 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
11d10 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
11d20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
11d30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11d40 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
11d50 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  db, pSel);.    }
11d60 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 6e 45   else {.      nE
11d70 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rr++;.    }.  }.
11d80 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
11d90 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
11da0 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
11db0 73 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  s;.#endif /* SQL
11dc0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
11dd0 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
11de0 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   .}.#endif /* !d
11df0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11e00 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
11e10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11e20 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
11e30 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
11e40 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
11e50 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
11e60 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
11e70 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
11e80 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
11e90 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
11ea0 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
11eb0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
11ec0 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
11ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11ee0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
11ef0 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29  ld(db, idx, 0) )
11f00 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
11f10 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
11f20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
11f30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
11f40 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
11f50 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
11f60 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
11f70 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61  h); i;i=sqliteHa
11f80 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
11f90 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
11fa0 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
11fb0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
11fc0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11fd0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
11fe0 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
11ff0 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
12000 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
12010 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
12020 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
12030 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
12040 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
12050 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
12060 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
12070 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
12080 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12090 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
120a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
120b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
120c0 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
120d0 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
120e0 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
120f0 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
12100 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
12110 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
12120 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
12130 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
12140 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
12150 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
12160 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
12170 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
12180 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
12190 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
121a0 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
121b0 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
121c0 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
121d0 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
121e0 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
121f0 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
12200 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
12210 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
12220 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
12230 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
12240 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
12250 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
12260 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
12270 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
12280 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
12290 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
122a0 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
122b0 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
122c0 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
122d0 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
122e0 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
122f0 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
12300 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
12310 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
12320 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
12330 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
12340 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
12350 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
12360 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
12370 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
12380 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
12390 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
123a0 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
123b0 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
123c0 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
123d0 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
123e0 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
123f0 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
12400 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
12410 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12420 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
12430 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
12440 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
12450 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
12460 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
12470 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
12480 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
12490 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
124a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
124b0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
124c0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
124d0 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
124e0 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
124f0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
12500 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
12510 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
12520 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
12530 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
12540 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
12550 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
12560 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
12570 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
12580 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
12590 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
125a0 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
125b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
125c0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
125d0 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
125e0 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
125f0 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
12600 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
12610 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
12620 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
12630 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
12640 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
12650 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
12660 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
12670 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
12680 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
12690 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
126a0 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
126b0 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
126c0 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
126d0 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
126e0 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
126f0 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
12700 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
12710 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
12720 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
12730 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
12740 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
12750 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
12760 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
12770 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
12780 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
12790 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
127a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
127b0 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
127c0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
127d0 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
127e0 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
127f0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
12800 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
12810 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12820 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
12830 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
12840 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
12850 69 54 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71  iTable>1 );.  sq
12860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12870 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
12880 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
12890 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
128a0 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  rt(pParse);.#ifn
128b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
128c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
128d0 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65  OP_Destroy store
128e0 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20  s an in integer 
128f0 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  r1. If this inte
12900 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
12910 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
12920 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
12930 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
12940 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
12950 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
12960 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
12970 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
12980 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
12990 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
129a0 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
129b0 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69   ** The "#NNN" i
129c0 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
129d0 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
129e0 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
129f0 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
12a00 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e  s in register NN
12a10 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20  N.  See grammar 
12a20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64  rules associated
12a30 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47   with the TK_REG
12a40 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ISTER.  ** token
12a50 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
12a60 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
12a70 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
12a80 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
12a90 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
12aa0 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
12ab0 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44  %d WHERE #%d AND
12ac0 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a   rootpage=#%d",.
12ad0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
12ae0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
12af0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
12b00 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  b), iTable, r1, 
12b10 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
12b20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12b30 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
12b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
12b50 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
12b60 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
12b70 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
12b80 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
12b90 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
12ba0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
12bb0 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
12bc0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
12bd0 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
12be0 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
12bf0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
12c00 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
12c10 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
12c20 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
12c30 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
12c40 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
12c50 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
12c60 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
12c70 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
12c80 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
12c90 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
12ca0 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
12cb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12cc0 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
12cd0 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  ;.  int iDb = sq
12ce0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12cf0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
12d00 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
12d10 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12d20 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
12d30 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72  num, iDb);.  for
12d40 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
12d50 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
12d60 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12d70 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12d80 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
12d90 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23  num, iDb);.  }.#
12da0 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
12db0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
12dc0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
12dd0 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
12de0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12df0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
12e00 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
12e10 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
12e20 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
12e30 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
12e40 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
12e50 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
12e60 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
12e70 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
12e80 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
12e90 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
12ea0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
12eb0 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
12ec0 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
12ed0 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
12ee0 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
12ef0 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
12f00 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
12f10 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
12f20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
12f30 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
12f40 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
12f50 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
12f60 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
12f70 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
12f80 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
12f90 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
12fa0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
12fb0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
12fc0 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
12fd0 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
12fe0 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
12ff0 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
13000 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
13010 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
13020 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
13030 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
13040 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
13050 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
13060 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
13070 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
13080 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
13090 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
130a0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
130b0 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
130c0 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
130d0 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
130e0 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
130f0 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
13100 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
13110 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
13120 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
13130 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
13140 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
13150 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
13160 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
13170 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
13180 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
13190 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
131a0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
131b0 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
131c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
131d0 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
131e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
131f0 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
13200 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
13210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13220 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
13230 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
13240 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
13250 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
13260 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
13270 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
13280 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
13290 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
132a0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
132b0 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
132c0 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
132d0 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
132e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
132f0 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
13300 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
13310 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
13320 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
13330 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
13340 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
13350 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
13360 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
13370 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
13380 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
13390 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
133a0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
133b0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
133c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
133d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
133e0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
133f0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
13400 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
13410 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
13420 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
13430 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
13440 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
13450 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
13460 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
13470 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
13480 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
13490 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
134a0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
134b0 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
134c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
134d0 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
134e0 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
134f0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
13500 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
13510 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
13520 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
13530 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13540 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
13550 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
13560 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
13570 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
13580 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
13590 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
135a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
135b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
135c0 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
135d0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
135e0 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
135f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
13600 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
13610 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
13620 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
13630 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
13640 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
13650 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
13660 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
13670 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
13680 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13690 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
136a0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
136b0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
136c0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
136d0 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
136e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
136f0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
13700 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
13710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13720 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
13730 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
13740 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
13750 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
13760 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
13770 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
13780 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
13790 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
137a0 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
137b0 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
137c0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
137d0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
137e0 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
137f0 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
13800 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
13810 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
13820 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
13830 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
13840 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
13850 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
13860 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
13870 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
13880 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
13890 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
138a0 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
138b0 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
138c0 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
138d0 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
138e0 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
138f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13900 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
13910 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
13920 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
13930 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
13940 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
13950 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
13960 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
13970 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
13980 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
13990 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
139a0 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
139b0 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
139c0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
139d0 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
139e0 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
139f0 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
13a00 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
13a10 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
13a20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
13a30 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
13a40 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
13a50 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
13a60 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
13a70 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
13a80 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
13a90 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
13aa0 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
13ab0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
13ac0 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
13ad0 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
13ae0 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
13af0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
13b00 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
13b10 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
13b20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
13b30 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
13b40 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
13b50 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
13b60 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
13b70 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
13b80 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
13b90 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
13ba0 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
13bb0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
13bc0 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
13bd0 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
13be0 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
13bf0 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
13c00 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
13c10 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
13c20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
13c30 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
13c40 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
13c50 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13c60 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
13c70 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
13c80 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
13c90 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
13ca0 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
13cb0 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
13cc0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
13cd0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
13ce0 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
13cf0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13d00 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c  .    destroyTabl
13d10 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
13d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
13d30 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
13d40 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
13d50 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
13d60 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20  and modify.  ** 
13d70 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
13d80 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  e..  */.  if( Is
13d90 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13da0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13db0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
13dc0 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
13dd0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
13de0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13df0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13e00 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
13e10 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
13e20 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
13e30 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
13e40 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
13e50 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
13e60 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  (db, iDb);.}../*
13e70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13e80 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
13e90 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
13ea0 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
13eb0 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
13ec0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13ed0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
13ee0 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
13ef0 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
13f00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
13f10 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
13f20 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
13f30 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
13f40 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
13f50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13f60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
13f70 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62  t iDb;..  if( db
13f80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13f90 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13fa0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
13fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
13fc0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61  ->nErr==0 );.  a
13fd0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
13fe0 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73  rc==1 );.  if( s
13ff0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
14000 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
14010 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14020 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
14030 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
14040 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
14050 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
14060 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77  m(pParse, isView
14070 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  , &pName->a[0]);
14080 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
14090 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d  b->suppressErr--
140a0 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
140b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72   ){.    if( noEr
140c0 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  r ) sqlite3CodeV
140d0 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
140e0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
140f0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
14100 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14110 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
14120 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
14130 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
14140 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
14150 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
14160 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
14170 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62  );..  /* If pTab
14180 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
14190 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65  ble, call ViewGe
141a0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74  tColumnNames() t
141b0 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74  o ensure.  ** it
141c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
141d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
141e0 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73  rtual(pTab) && s
141f0 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
14200 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
14210 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
14220 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14230 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  le;.  }.#ifndef 
14240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
14250 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
14260 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
14270 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
14280 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
14290 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
142a0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
142b0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
142c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
142d0 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
142e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
142f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14300 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
14310 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
14320 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14330 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
14340 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
14350 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
14360 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
14370 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
14380 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
14390 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
143a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
143b0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
143c0 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
143d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
143e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
143f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
14400 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
14410 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
14420 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
14430 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
14440 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
14450 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
14460 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
14470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14480 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
14490 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
144a0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
144b0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
144c0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
144d0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
144e0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
144f0 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
14500 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
14510 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14520 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
14530 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
14540 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14550 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14570 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14580 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14590 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
145a0 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
145b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
145c0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
145d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
145e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
145f0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14600 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
14610 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
14620 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
14630 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  Name, "sqlite_st
14640 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20  at", 11)!=0 ){. 
14650 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14660 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
14670 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
14680 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
14690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
146a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
146b0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
146c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
146d0 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
146e0 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
146f0 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
14700 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
14710 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
14720 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
14730 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
14740 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
14750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14760 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
14770 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
14780 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
14790 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
147a0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
147b0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
147c0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
147d0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
147e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
147f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
14800 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
14810 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
14820 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14830 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14840 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
14850 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
14860 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
14870 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
14880 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
14890 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
148a0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
148b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
148c0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
148d0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
148e0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
148f0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
14900 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
14910 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
14920 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
14930 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
14940 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
14950 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
14960 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
14970 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
14980 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
14990 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a  b, isView);.  }.
149a0 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
149b0 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
149c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
149d0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
149e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
149f0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
14a00 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
14a10 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
14a20 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
14a30 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
14a40 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
14a50 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
14a60 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
14a70 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
14a80 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
14a90 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
14aa0 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
14ab0 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
14ac0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
14ad0 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
14ae0 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
14af0 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
14b00 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65  ed to (a.k.a the
14b10 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29   "parent" table)
14b20 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
14b30 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73  ist.** of tables
14b40 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
14b50 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73  To table.  flags
14b60 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a   contains all.**
14b70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
14b80 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ut the conflict 
14b90 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
14ba0 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a  ithms specified.
14bb0 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c  ** in the ON DEL
14bc0 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61  ETE, ON UPDATE a
14bd0 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61  nd ON INSERT cla
14be0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  uses..**.** An F
14bf0 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73  Key structure is
14c00 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64   created and add
14c10 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
14c20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64  currently.** und
14c30 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
14c40 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70  in the pParse->p
14c50 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a  NewTable field..
14c60 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
14c70 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
14c80 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
14c90 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
14ca0 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
14cb0 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
14cc0 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
14cd0 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
14ce0 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
14cf0 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
14d00 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
14d10 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14d20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14d30 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
14d40 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
14d50 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
14d60 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
14d70 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
14d80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
14d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
14da0 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
14db0 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
14dc0 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
14dd0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
14de0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
14df0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
14e00 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
14e10 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
14e20 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
14e30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14e40 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e  pParse->db;.#ifn
14e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14e60 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
14e70 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
14e80 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a   FKey *pNextTo;.
14e90 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61    Table *p = pPa
14ea0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
14eb0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
14ec0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
14ed0 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
14ee0 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
14ef0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
14f00 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
14f10 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
14f20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
14f30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
14f40 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
14f50 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c    if( NEVER(iCol
14f60 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  <0) ) goto fk_en
14f70 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
14f80 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
14f90 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
14fa0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14fb0 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
14fc0 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
14fd0 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
14fe0 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
14ff0 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
15000 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
15010 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
15020 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
15030 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15040 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
15050 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
15060 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
15070 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
15080 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
15090 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
150a0 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
150b0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
150c0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
150d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
150e0 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
150f0 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
15100 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
15110 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
15120 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
15130 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
15140 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
15150 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
15160 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e  eof(*pFKey) + (n
15170 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46  Col-1)*sizeof(pF
15180 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
15190 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
151a0 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
151b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
151c0 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
151d0 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
151e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
151f0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
15200 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
15210 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
15220 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
15230 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
15240 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20  f( pFKey==0 ){. 
15250 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
15260 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72    }.  pFKey->pFr
15270 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
15280 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
15290 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
152a0 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c  ar*)&pFKey->aCol
152b0 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d  [nCol];.  pFKey-
152c0 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
152d0 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
152e0 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
152f0 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  n] = 0;.  sqlite
15300 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a  3Dequote(z);.  z
15310 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
15320 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
15330 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
15340 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
15350 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
15360 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
15370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
15380 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15390 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
153a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
153b0 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
153c0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
153d0 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
153e0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
153f0 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
15400 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
15410 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
15420 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
15430 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15450 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
15460 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
15470 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15480 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15490 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
154a0 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
154b0 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
154c0 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
154d0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
154e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
154f0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
15500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15510 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
15520 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15530 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15540 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
15550 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
15560 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
15570 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
15580 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
15590 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
155a0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
155b0 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
155c0 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
155d0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
155e0 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
155f0 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
15600 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38  aAction[0] = (u8
15610 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b  )(flags & 0xff);
15620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15630 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20  N DELETE action 
15640 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  */.  pFKey->aAct
15650 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66  ion[1] = (u8)((f
15660 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
15670 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50  ff);    /* ON UP
15680 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a  DATE action */..
15690 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
156a0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
156b0 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65  (db, 0, p->pSche
156c0 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f  ma) );.  pNextTo
156d0 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74   = (FKey *)sqlit
156e0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
156f0 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
15700 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79  sh, .      pFKey
15710 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70  ->zTo, (void *)p
15720 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  FKey.  );.  if( 
15730 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29  pNextTo==pFKey )
15740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
15750 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67  Fault(db);.    g
15760 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
15770 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b    if( pNextTo ){
15780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
15790 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30  xtTo->pPrevTo==0
157a0 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70   );.    pFKey->p
157b0 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f  NextTo = pNextTo
157c0 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70  ;.    pNextTo->p
157d0 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a  PrevTo = pFKey;.
157e0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
157f0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
15800 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
15810 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
15820 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
15830 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
15840 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
15850 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15860 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
15870 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
15880 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15890 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
158a0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
158b0 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
158c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
158d0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
158e0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
158f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15900 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
15910 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
15920 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
15930 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
15940 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
15950 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
15960 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
15970 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
15980 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
15990 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
159a0 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
159b0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
159c0 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
159d0 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
159e0 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
159f0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
15a00 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
15a10 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
15a20 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
15a30 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
15a40 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
15a50 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
15a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
15a70 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
15a80 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
15a90 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
15aa0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
15ab0 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
15ac0 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
15ad0 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
15ae0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
15af0 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
15b00 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20  ferred==1 ); /* 
15b10 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31  EV: R-30323-2191
15b20 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73  7 */.  pFKey->is
15b30 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
15b40 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
15b50 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
15b60 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
15b70 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
15b80 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
15b90 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
15ba0 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
15bb0 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
15bc0 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
15bd0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
15be0 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
15bf0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
15c00 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
15c10 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
15c20 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
15c30 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
15c40 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
15c50 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
15c60 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
15c70 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
15c80 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
15c90 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
15ca0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
15cb0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
15cc0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
15cd0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
15ce0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
15cf0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
15d00 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
15d10 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
15d20 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
15d30 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
15d40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
15d50 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
15d60 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
15d70 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
15d80 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
15d90 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
15da0 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
15db0 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
15dc0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
15dd0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
15de0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
15df0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
15e00 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
15e10 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
15e20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
15e30 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
15e40 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
15e50 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
15e60 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
15e70 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
15e80 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b  /.  int iSorter;
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
15eb0 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65  ned by OpenSorte
15ec0 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f  r (if in use) */
15ed0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
15f00 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
15f10 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20   int addr2;     
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75  /* Address to ju
15f40 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69  mp to for next i
15f50 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  teration */.  in
15f60 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f80 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
15f90 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ex */.  int iPar
15fa0 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20  tIdxLabel;      
15fb0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74         /* Jump t
15fc0 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20  o this label to 
15fd0 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20  skip a row */.  
15fe0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16000 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16010 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
16020 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
16030 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16050 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
16060 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ex */.  int regR
16070 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
16080 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
16090 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
160a0 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  bled index recor
160b0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
160c0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
160d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
160e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
160f0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
16100 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
16110 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
16120 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
16130 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16140 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
16150 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16160 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16170 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
16180 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
16190 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
161a0 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  ].zName ) ){.   
161b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
161c0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
161d0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
161e0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
161f0 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
16200 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
16210 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
16220 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
16230 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
16240 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
16250 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16260 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
16270 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
16280 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
16290 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
162a0 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
162b0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
162c0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
162d0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
162e0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
162f0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
16300 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73  .  /* Open the s
16310 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20  orter cursor if 
16320 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e  we are to use on
16330 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20  e. */.  iSorter 
16340 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
16350 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16360 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
16370 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c  erOpen, iSorter,
16380 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79   0, pIndex->nKey
16390 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20  Col, (char*).   
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
163c0 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59  ef(pKey), P4_KEY
163d0 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  INFO);..  /* Ope
163e0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f  n the table. Loo
163f0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f  p through all ro
16400 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c  ws of the table,
16410 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78   inserting index
16420 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e  .  ** records in
16430 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  to the sorter. *
16440 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  /.  sqlite3OpenT
16450 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
16460 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
16470 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
16480 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
16490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
164a0 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20  wind, iTab, 0); 
164b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
164c0 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
164d0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
164e0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
164f0 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
16500 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64  xKey(pParse,pInd
16510 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72  ex,iTab,regRecor
16520 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62  d,0,&iPartIdxLab
16530 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  el,0,0);.  sqlit
16540 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16550 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
16560 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16570 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
16580 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62  esolvePartIdxLab
16590 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74  el(pParse, iPart
165a0 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
165b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
165c0 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
165d0 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43   addr1+1); VdbeC
165e0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
165f0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16600 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69  e(v, addr1);.  i
16610 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30  f( memRootPage<0
16620 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
16630 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
16640 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
16650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16660 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  4(v, OP_OpenWrit
16670 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69  e, iIdx, tnum, i
16680 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  Db, .           
16690 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a           (char *
166a0 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46  )pKey, P4_KEYINF
166b0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
166c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
166d0 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
166e0 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
166f0 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
16700 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
16710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16720 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
16730 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64   iSorter, 0); Vd
16740 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16750 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30   assert( pKey!=0
16760 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
16770 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
16780 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20 49 73  nErr );.  if( Is
16790 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
167a0 65 78 29 20 26 26 20 70 4b 65 79 21 3d 30 20 29  ex) && pKey!=0 )
167b0 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73  {.    int j2 = s
167c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
167d0 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
167e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
167f0 6f 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64  o(v, j2);.    ad
16800 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
16810 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
16820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16830 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
16840 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69  SorterCompare, i
16850 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52  Sorter, j2, regR
16860 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29  pIndex->nKeyCol)
16890 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
168a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  );.    sqlite3Un
168b0 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  iqueConstraint(p
168c0 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
168d0 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73   pIndex);.  }els
168e0 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
168f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16900 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
16910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16920 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
16930 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
16940 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20  Record, iIdx);. 
16950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16960 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69  p3(v, OP_Last, i
16970 49 64 78 2c 20 30 2c 20 2d 31 29 3b 0a 20 20 73  Idx, 0, -1);.  s
16980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16990 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
169a0 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
169b0 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 0);.  sqlite3
169c0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
169d0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
169e0 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
169f0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
16a00 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
16a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16a20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16a30 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
16a40 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f  , addr2); VdbeCo
16a50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
16a60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16a70 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73  (v, addr1);..  s
16a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16a90 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
16aa0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
16ab0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16ac0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73  lose, iIdx);.  s
16ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16ae0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
16af0 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orter);.}../*.**
16b00 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73   Allocate heap s
16b10 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20  pace to hold an 
16b20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74  Index object wit
16b30 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a  h nCol columns..
16b40 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  **.** Increase t
16b50 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  he allocation si
16b60 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  ze to provide an
16b70 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79   extra nExtra by
16b80 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65  tes.** of 8-byte
16b90 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61   aligned space a
16ba0 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
16bb0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
16bc0 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
16bd0 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63   this extra spac
16be0 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a  e in *ppExtra..*
16bf0 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
16c00 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
16c10 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
16c20 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
16c30 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16c40 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c  on */.  i16 nCol
16c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16c60 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
16c70 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
16c80 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ndex */.  int nE
16c90 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f  xtra,          /
16ca0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16cb0 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65  s of extra space
16cc0 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   to alloc */.  c
16cd0 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20  har **ppExtra   
16ce0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
16cf0 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70  o the "extra" sp
16d00 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ace */.){.  Inde
16d10 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
16d20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e   /* Allocated in
16d30 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
16d40 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
16d50 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
16d60 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78   space for Index
16d70 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73   object + arrays
16d80 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52   */..  nByte = R
16d90 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
16da0 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  ex)) +          
16db0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
16dc0 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
16dd0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
16de0 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20  of(char*)*nCol) 
16df0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  +         /* Ind
16e00 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
16e10 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
16e20 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  8(sizeof(LogEst)
16e30 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
16e40 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f  /* Index.aiRowLo
16e50 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  gEst   */.      
16e60 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
16e70 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
16e80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
16e90 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
16ec0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
16ed0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
16ee0 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
16ef0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
16f00 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
16f10 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
16f20 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
16f30 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
16f40 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
16f50 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
16f60 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
16f70 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  **)pExtra; pExtr
16f80 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
16f90 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
16fa0 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67  .    p->aiRowLog
16fb0 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  Est = (LogEst*)p
16fc0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
16fd0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a   sizeof(LogEst)*
16fe0 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
16ff0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
17000 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
17010 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
17020 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
17030 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
17040 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
17050 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
17060 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
17070 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
17080 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
17090 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
170a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
170b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
170c0 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
170d0 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
170e0 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
170f0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
17100 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
17110 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
17120 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
17130 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
17140 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
17150 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
17160 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
17170 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
17180 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
17190 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
171a0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
171b0 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
171c0 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
171d0 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
171e0 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
171f0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
17200 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
17210 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
17220 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
17230 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
17240 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
17250 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
17260 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
17270 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
17280 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
17290 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
172a0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
172b0 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
172c0 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
172d0 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
172e0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
172f0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
17300 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
17310 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
17320 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a  struction.  .**.
17330 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
17340 69 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65  is created succe
17350 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20  ssfully, return 
17360 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17370 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74   new Index.** st
17380 72 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73  ructure. This is
17390 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
173a0 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20  AddPrimaryKey() 
173b0 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65  to mark the inde
173c0 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  x.** as the tabl
173d0 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28  es primary key (
173e0 49 6e 64 65 78 2e 69 64 78 54 79 70 65 3d 3d 53  Index.idxType==S
173f0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
17400 49 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64  IMARYKEY).*/.Ind
17410 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
17420 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
17430 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
17440 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
17450 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
17460 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
17470 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
17480 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
17490 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
174a0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
174b0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
174c0 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
174d0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
174e0 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
174f0 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
17500 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
17510 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
17520 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
17530 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
17540 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
17550 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
17560 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
17570 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
17580 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
17590 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
175a0 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
175b0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
175c0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
175d0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
175e0 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
175f0 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  nt */.  Expr *pP
17600 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48  IWhere,    /* WH
17610 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70  ERE clause for p
17620 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a  artial indices *
17630 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
17640 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
17650 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
17660 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
17670 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
17680 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
17690 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
176a0 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
176b0 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ts */.){.  Index
176c0 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
176d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65  /* Pointer to re
176e0 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  turn */.  Table 
176f0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
17700 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
17710 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
17720 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
17730 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
17740 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
17750 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
17760 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17770 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
17780 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
17790 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
177a0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
177b0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
177c0 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
177d0 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
177e0 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
177f0 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
17800 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
17810 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
17820 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
17830 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
17840 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
17850 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
17860 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
17870 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
17880 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
17890 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
178a0 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
178b0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
178c0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
178d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
178e0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
178f0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
17900 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
17910 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
17920 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
17930 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
17940 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
17950 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17960 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
17970 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
17980 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
17990 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
179a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
179b0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
179c0 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
179d0 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
17a00 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
17a10 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
17a20 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
17a30 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
17a40 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
17a50 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
17a60 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
17a70 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
17a80 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
17a90 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
17aa0 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
17ab0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17ac0 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
17ad0 54 41 42 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  TAB || pParse->n
17ae0 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74  Err>0 ){.    got
17af0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17b00 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  dex;.  }.  if( S
17b10 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
17b20 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
17b30 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
17b40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17b50 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
17b60 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
17b70 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
17b80 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
17b90 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
17ba0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
17bb0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20  TblName!=0 ){.. 
17bc0 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77     /* Use the tw
17bd0 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d  o-part index nam
17be0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
17bf0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
17c00 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f   ** to search fo
17c10 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69  r the table. 'Fi
17c20 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  x' the table nam
17c30 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20  e to this db.   
17c40 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69   ** before looki
17c50 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e  ng up the table.
17c60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
17c70 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e  rt( pName1 && pN
17c80 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20  ame2 );.    iDb 
17c90 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
17ca0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
17cb0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
17cc0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
17cd0 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
17ce0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17cf0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20    assert( pName 
17d00 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a  && pName->z );..
17d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17d20 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
17d30 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
17d40 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
17d50 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
17d60 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
17d70 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
17d80 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
17d90 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
17da0 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
17db0 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
17dc0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
17dd0 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
17de0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
17df0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
17e00 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
17e10 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
17e20 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
17e30 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
17e40 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
17e50 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
17e60 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
17e70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
17e80 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
17e90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
17ea0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
17eb0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
17ec0 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
17ed0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
17ee0 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
17ef0 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b  ix, pTblName) ){
17f00 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
17f10 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
17f20 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
17f30 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
17f40 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
17f50 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
17f60 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
17f70 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
17f80 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
17f90 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
17fa0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
17fb0 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54  m(pParse, 0, &pT
17fc0 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  blName->a[0]);. 
17fd0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
17fe0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c  allocFailed==0 |
17ff0 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  | pTab==0 );.   
18000 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
18010 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18020 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69  index;.    if( i
18030 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62  Db==1 && db->aDb
18040 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70  [iDb].pSchema!=p
18050 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
18060 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18070 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
18080 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
18090 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20  t create a TEMP 
180a0 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d  index on non-TEM
180b0 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c  P table \"%s\"",
180c0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
180d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
180e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
180f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18100 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
18110 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71  pTab) ) pPk = sq
18120 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
18130 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
18140 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
18150 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
18160 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
18170 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
18180 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18190 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
181a0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
181b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
181c0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
181d0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
181e0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
181f0 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
18200 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
18210 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
18220 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
18230 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
18240 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
18250 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
18260 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
18270 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e   .       && db->
18280 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66  init.busy==0.#if
18290 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
182a0 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
182b0 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65     && sqlite3Use
182c0 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d  rAuthTable(pTab-
182d0 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69  >zName)==0.#endi
182e0 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  f.       && sqli
182f0 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61  te3StrNICmp(&pTa
18300 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74  b->zName[7],"alt
18310 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b  ertab_",9)!=0 ){
18320 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
18330 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
18340 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
18350 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
18360 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
18370 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18380 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  ndex;.  }.#ifnde
18390 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
183a0 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70  EW.  if( pTab->p
183b0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
183c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
183d0 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79  arse, "views may
183e0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
183f0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
18400 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18410 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
18420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18430 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
18440 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
18450 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18460 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18470 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  "virtual tables 
18480 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
18490 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
184a0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
184b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
184c0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
184d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
184e0 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  ex.  Make sure t
184f0 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  here is not alre
18500 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a  ady another.  **
18510 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
18520 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
18530 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  me.  .  **.  ** 
18540 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77  Exception:  If w
18550 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
18560 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61  e names of perma
18570 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f  nent indices fro
18580 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  m the.  ** sqlit
18590 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28  e_master table (
185a0 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68  because some oth
185b0 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67  er process chang
185c0 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61  ed the schema) a
185d0 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74  nd.  ** one of t
185e0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63  he index names c
185f0 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65  ollides with the
18600 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f   name of a tempo
18610 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20  rary table or.  
18620 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77  ** index, then w
18630 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
18640 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20  to process this 
18650 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
18660 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20   If pName==0 it 
18670 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72  means that we ar
18680 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77  e.  ** dealing w
18690 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65  ith a primary ke
186a0 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  y or UNIQUE cons
186b0 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65  traint.  We have
186c0 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20   to invent our. 
186d0 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20   ** own name..  
186e0 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29  */.  if( pName )
186f0 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
18700 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
18710 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
18720 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
18730 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18740 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
18750 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d  sert( pName->z!=
18760 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  0 );.    if( SQL
18770 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
18780 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
18790 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
187a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
187b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
187c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
187d0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
187e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
187f0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
18800 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
18810 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18820 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
18830 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
18840 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
18850 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
18860 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18870 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
18880 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
18890 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
188a0 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
188b0 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
188c0 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
188d0 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
188e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
188f0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
18900 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
18910 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
18920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18930 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
18940 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
18950 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
18960 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
18970 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
18980 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18990 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
189a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
189b0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
189c0 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
189d0 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
189e0 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
189f0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
18a00 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
18a10 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
18a20 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
18a30 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
18a40 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
18a50 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
18a60 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
18a70 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18a80 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18a90 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
18aa0 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
18ab0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
18ac0 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
18ad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18ae0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
18af0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18b00 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65  zDb = pDb->zName
18b10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18b20 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
18b30 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
18b40 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
18b50 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
18b60 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18b70 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18b80 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
18b90 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
18ba0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
18bb0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
18bc0 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
18bd0 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
18be0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
18bf0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18c00 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
18c10 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
18c20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18c30 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18c40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
18c50 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
18c60 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
18c70 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
18c80 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
18c90 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
18ca0 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
18cb0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
18cc0 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
18cd0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
18ce0 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
18cf0 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
18d00 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
18d10 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
18d20 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f      Token prevCo
18d30 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  l;.    sqlite3To
18d40 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c  kenInit(&prevCol
18d50 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  , pTab->aCol[pTa
18d60 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
18d70 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
18d80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
18d90 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a  pend(pParse, 0,.
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
18db0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
18dc0 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43  b, TK_ID, &prevC
18dd0 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28  ol, 0));.    if(
18de0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
18df0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18e00 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
18e10 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  pList->nExpr==1 
18e20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
18e30 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
18e40 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72  er(pList, sortOr
18e50 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  der);.  }else{. 
18e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
18e70 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50  stCheckLength(pP
18e80 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e  arse, pList, "in
18e90 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dex");.  }..  /*
18ea0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
18eb0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
18ec0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
18ed0 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
18ee0 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
18ef0 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
18f00 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
18f10 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
18f20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
18f30 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
18f40 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
18f50 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
18f60 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
18f70 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
18f80 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
18f90 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
18fa0 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
18fb0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
18fc0 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
18fd0 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
18fe0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
18ff0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
19000 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
19010 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
19020 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
19030 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
19040 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
19050 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
19060 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
19070 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
19080 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
190c0 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
190d0 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
190e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
190f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19100 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
19110 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
19120 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
19130 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  dex->aiRowLogEst
19140 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
19150 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
19160 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ENT(pIndex->azCo
19170 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d  ll) );.  pIndex-
19180 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b  >zName = zExtra;
19190 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61  .  zExtra += nNa
191a0 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79  me + 1;.  memcpy
191b0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
191c0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
191d0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
191e0 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
191f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
19200 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
19210 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
19220 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e   = onError!=OE_N
19230 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  one;.  pIndex->i
19240 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20 3f  dxType = pName ?
19250 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
19260 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45 5f  APPDEF : SQLITE_
19270 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b 0a  IDXTYPE_UNIQUE;.
19280 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
19290 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
192a0 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
192b0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
192c0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
192d0 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
192e0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
192f0 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
19300 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
19310 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
19320 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
19330 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
19340 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
19350 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
19360 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
19370 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
19380 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
19390 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
193a0 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
193b0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
193c0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
193d0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
193e0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
193f0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
19400 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
19410 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
19420 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
19430 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
19440 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
19450 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
19460 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c  /.  }..  /* Anal
19470 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  yze the list of 
19480 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
19490 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20   form the terms 
194a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
194b0 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79  .  ** report any
194c0 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65   errors.  In the
194d0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
194e0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
194f0 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a  n is exactly.  *
19500 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  * a table column
19510 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c  , store that col
19520 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  umn in aiColumn[
19530 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20  ].  For general 
19540 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a  expressions,.  *
19550 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65  * populate pInde
19560 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20  x->aColExpr and 
19570 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d  store XN_EXPR (-
19580 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  2) in aiColumn[]
19590 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
195a0 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
195b0 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  g if two or more
195c0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
195d0 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69  index are identi
195e0 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20  cal..  ** TODO: 
195f0 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20  Issue a warning 
19600 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69  if the table pri
19610 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
19620 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
19630 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a    ** index key..
19640 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
19650 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
19660 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
19670 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
19680 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
19690 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20  *pCExpr;        
196a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
196b0 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72   i-th index expr
196c0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ession */.    in
196d0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
196e0 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  rder;        /* 
196f0 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74  ASC or DESC on t
19700 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69  he i-th expressi
19710 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
19720 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
19730 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
19740 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
19750 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69  ame */..    sqli
19760 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c  te3StringToId(pL
19770 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
19780 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
19790 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
197a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
197b0 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74  C_IdxExpr, pList
197c0 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Item->pExpr, 0);
197d0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
197e0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
197f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19800 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c      pCExpr = sql
19810 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
19820 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  ate(pListItem->p
19830 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
19840 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  CExpr->op!=TK_CO
19850 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66  LUMN ){.      if
19860 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
19870 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
19880 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19890 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
198a0 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62  pressions prohib
198b0 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20  ited in PRIMARY 
198c0 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20  KEY and ".      
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55            "UNIQU
198f0 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  E constraints");
19900 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
19910 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19930 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45  f( pIndex->aColE
19940 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xpr==0 ){.      
19950 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f 70    ExprList *pCop
19960 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
19970 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73 74  istDup(db, pList
19980 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 49  , 0);.        pI
19990 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
199a0 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   pCopy;.        
199b0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
199c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
199d0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70 79     assert( pCopy
199e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
199f0 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70 43   pListItem = &pC
19a00 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  opy->a[i];.     
19a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19a20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
19a30 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
19a40 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
19a50 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
19a60 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
19a70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19a80 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
19a90 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
19aa0 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
19ab0 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
19ac0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
19ad0 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
19ae0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
19af0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
19b00 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
19b10 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
19b20 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
19b30 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
19b40 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
19b50 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
19b60 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
19b70 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
19b80 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
19b90 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
19ba0 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
19bb0 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
19bc0 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
19bd0 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
19be0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
19bf0 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
19c00 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
19c10 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
19c20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
19c30 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
19c40 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
19c50 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
19c60 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
19c70 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
19c80 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
19c90 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
19ca0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
19cb0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
19cc0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
19cd0 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
19ce0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
19cf0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
19d00 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
19d10 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
19d20 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
19d30 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19d40 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19d50 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
19d60 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
19d70 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
19d80 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
19d90 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
19da0 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
19db0 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
19dc0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
19dd0 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
19de0 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
19df0 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
19e00 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
19e10 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
19e20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
19e30 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
19e40 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
19e50 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
19e60 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
19e70 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
19e80 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
19e90 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
19ea0 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
19eb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
19ec0 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
19ed0 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
19ee0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
19ef0 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
19f00 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
19f10 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
19f20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
19f30 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19f40 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
19f50 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
19f60 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
19f70 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
19f80 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
19f90 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
19fa0 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
19fb0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
19fc0 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
19fd0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
19fe0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
19ff0 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1a000 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1a010 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a020 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1a030 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1a040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1a050 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a060 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1a070 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1a080 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1a090 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1a0a0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1a0b0 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1a0c0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1a0d0 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1a0e0 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1a0f0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1a100 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1a110 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1a120 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1a130 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1a140 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1a150 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1a160 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1a170 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1a180 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1a190 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1a1a0 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1a1b0 79 29 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  y)>=0 );.  if( p
1a1c0 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49  TblName!=0 && pI
1a1d0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  ndex->nColumn>=p
1a1e0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1a1f0 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72   pIndex->isCover
1a200 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  ing = 1;.    for
1a210 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1a220 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1a230 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
1a240 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ey ) continue;. 
1a250 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1a260 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1a270 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e  ndex,j)>=0 ) con
1a280 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e  tinue;.      pIn
1a290 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1a2a0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1a2b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1a2c0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1a2d0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1a2e0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
1a2f0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
1a300 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
1a310 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
1a320 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
1a330 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
1a340 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1a350 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
1a360 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
1a370 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
1a380 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1a390 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
1a3a0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
1a3b0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
1a3c0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
1a3d0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
1a3e0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
1a3f0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
1a400 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1a410 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
1a420 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
1a430 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
1a440 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1a450 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
1a460 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
1a470 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
1a480 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
1a490 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
1a4a0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
1a4b0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
1a4c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1a4d0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
1a4e0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
1a4f0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
1a500 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
1a510 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
1a520 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
1a530 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1a540 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1a550 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
1a560 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
1a570 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
1a580 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
1a590 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
1a5a0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
1a5b0 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
1a5c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1a5d0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
1a5e0 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
1a5f0 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
1a600 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
1a610 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
1a620 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
1a630 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
1a640 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
1a650 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
1a660 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
1a670 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
1a680 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
1a690 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
1a6a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
1a6b0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
1a6c0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
1a6d0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
1a6e0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
1a6f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a700 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
1a710 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
1a720 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
1a730 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1a740 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
1a750 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1a760 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
1a770 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
1a780 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
1a790 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
1a7a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a7b0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
1a7c0 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
1a7d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1a7e0 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
1a7f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
1a800 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a810 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1a820 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]>=0 );.        
1a830 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
1a840 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
1a850 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
1a860 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
1a870 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
1a880 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
1a890 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
1a8a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1a8b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c  lite3StrICmp(z1,
1a8c0 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20   z2) ) break;.  
1a8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a8e0 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  k==pIdx->nKeyCol
1a8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1a900 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
1a910 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
1a920 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1a930 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
1a940 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
1a950 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
1a960 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
1a970 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
1a980 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
1a990 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
1a9a0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
1a9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
1a9c0 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
1a9d0 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
1a9e0 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
1a9f0 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
1aa00 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1aa10 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
1aa20 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
1aa30 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
1aa40 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
1aa50 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
1aa60 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
1aa70 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
1aa80 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
1aa90 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
1aaa0 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
1aab0 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69  havior for the i
1aac0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
1aad0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1aae0 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   !(pIdx->onError
1aaf0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20  ==OE_Default || 
1ab00 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1ab10 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a  =OE_Default) ){.
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ab30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ab40 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
1ab50 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e       "conflictin
1ab60 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  g ON CONFLICT cl
1ab70 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22  auses specified"
1ab80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1ab90 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1aba0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1abb0 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
1abc0 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f           pIdx->o
1abd0 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d  nError = pIndex-
1abe0 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
1abf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ac00 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70          pRet = p
1ac10 49 64 78 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  Idx;.        got
1ac20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ac30 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1ac40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
1ac50 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
1ac60 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
1ac70 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
1ac80 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
1ac90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1aca0 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
1acb0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
1acc0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
1acd0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1ace0 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
1acf0 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
1ad00 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1ad10 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
1ad20 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
1ad30 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
1ad40 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
1ad50 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
1ad60 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1ad90 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
1ada0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
1adb0 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
1adc0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
1add0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
1ade0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
1adf0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1ae00 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1ae10 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1ae20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
1ae30 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
1ae40 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
1ae50 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1ae60 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1ae70 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
1ae80 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
1ae90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1aea0 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
1aeb0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1aec0 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
1aed0 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  BLE if the.  ** 
1aee0 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
1aef0 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
1af00 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1af10 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1af20 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74  ) then.  ** emit
1af30 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   code to allocat
1af40 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74  e the index root
1af50 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  page on disk and
1af60 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   make an entry f
1af70 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  or.  ** the inde
1af80 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
1af90 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
1afa0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
1afb0 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f  dex with.  ** co
1afc0 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1afd0 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1afe0 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1aff0 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1b000 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
1b010 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1b020 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1b030 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1b040 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1b050 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f  .  ** of a WITHO
1b060 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1b070 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
1b080 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
1b090 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
1b0a0 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
1b0b0 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
1b0c0 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  KEY.  ** or UNIQ
1b0d0 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
1b0e0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1b0f0 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
1b100 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
1b110 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
1b120 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
1b130 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
1b140 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
1b150 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
1b160 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
1b170 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61  */.  else if( Ha
1b180 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1b190 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1b1a0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1b1b0 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1b1c0 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50   int iMem = ++pP
1b1d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
1b1e0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1b1f0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
1b200 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
1b210 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b220 65 78 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ex;..    sqlite3
1b230 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1b240 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1b250 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  Db);..    /* Cre
1b260 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65  ate the rootpage
1b270 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75   for the index u
1b280 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78  sing CreateIndex
1b290 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20  . But before.   
1b2a0 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f   ** doing so, co
1b2b0 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75  de a Noop instru
1b2c0 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20  ction and store 
1b2d0 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a  its address in .
1b2e0 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1b2f0 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1b300 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1b310 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1b320 6c 79 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49  ly a .    ** PRI
1b330 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1b340 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1b350 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1b360 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1b370 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74    ** that case t
1b380 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  he convertToWith
1b390 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20  outRowidTable() 
1b3a0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70  routine will rep
1b3b0 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  lace.    ** the 
1b3c0 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f  Noop with a Goto
1b3d0 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68   to jump over th
1b3e0 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65  e VDBE code gene
1b3f0 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a  rated below. */.
1b400 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1b410 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b420 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(v, OP_Noop)
1b430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
1b450 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
1b460 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
1b470 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
1b480 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
1b490 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1b4a0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
1b4b0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
1b4c0 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
1b4d0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
1b4e0 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
1b4f0 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
1b500 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  oken.z - pName->
1b510 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61  z) + pParse->sLa
1b520 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  stToken.n;.     
1b530 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d   if( pName->z[n-
1b540 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20  1]==';' ) n--;. 
1b550 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
1b560 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
1b570 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
1b580 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
1b590 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
1b5a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1b5b0 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
1b5c0 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
1b5d0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
1b5e0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
1b5f0 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29  E", n, pName->z)
1b600 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b610 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
1b620 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
1b630 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
1b640 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
1b650 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
1b660 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
1b670 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
1b680 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
1b690 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1b6a0 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
1b6b0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
1b6c0 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
1b6d0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1b6e0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1b6f0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  se, .        "IN
1b700 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
1b710 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
1b720 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
1b730 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
1b740 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
1b750 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
1b760 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1b770 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
1b780 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1b790 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
1b7a0 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
1b7b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b7c0 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1b7d0 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1b7e0 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1b7f0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1b800 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1b810 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
1b820 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1b830 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1b840 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
1b850 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1b860 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b870 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1b880 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
1b890 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1b8a0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1b8b0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1b8c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b8d0 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
1b8e0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73   iDb,.         s
1b8f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1b900 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
1b910 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
1b920 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
1b930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b940 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
1b950 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  xpire, 0);.    }
1b960 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
1b970 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
1b980 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a  dex->tnum);.  }.
1b990 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
1b9a0 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
1b9b0 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
1b9c0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
1b9d0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
1b9e0 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
1b9f0 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
1ba00 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
1ba10 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
1ba20 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
1ba30 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
1ba40 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
1ba50 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
1ba60 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
1ba70 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
1ba80 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
1ba90 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
1baa0 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
1bab0 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1bac0 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
1bad0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
1bae0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
1baf0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
1bb00 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
1bb10 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
1bb20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
1bb30 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
1bb40 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
1bb50 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1bb60 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
1bb70 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
1bb80 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1bb90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bba0 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
1bbb0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1bbc0 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
1bbd0 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
1bbe0 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
1bbf0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1bc00 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
1bc10 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
1bc20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1bc30 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1bc40 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1bc50 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
1bc60 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
1bc70 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70    }.    pRet = p
1bc80 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65  Index;.    pInde
1bc90 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1bca0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
1bcb0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
1bcc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
1bcd0 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66 72   if( pIndex ) fr
1bce0 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1bcf0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1bd00 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1bd10 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1bd20 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1bd30 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1bd40 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1bd50 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1bd60 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1bd70 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
1bd80 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
1bd90 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
1bda0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
1bdb0 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
1bdc0 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
1bdd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1bde0 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
1bdf0 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
1be00 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
1be10 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
1be20 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
1be30 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1be40 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1be50 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
1be60 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
1be70 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
1be80 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
1be90 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
1bea0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
1beb0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1bec0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
1bed0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1bee0 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
1bef0 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
1bf00 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1bf10 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
1bf20 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1bf30 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
1bf40 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
1bf50 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1bf60 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
1bf70 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
1bf80 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
1bf90 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
1bfa0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
1bfb0 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
1bfc0 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
1bfd0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1bfe0 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
1bff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1c000 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
1c010 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
1c020 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
1c030 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
1c040 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
1c050 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
1c060 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
1c070 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
1c080 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
1c090 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
1c0a0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
1c0b0 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
1c0c0 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
1c0d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c0e0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
1c0f0 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a  dex *pIdx){.  /*
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20  10,  9,  8,  7, 
1c120 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61   6 */.  LogEst a
1c130 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32  Val[] = { 33, 32
1c140 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a  , 30, 28, 26 };.
1c150 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49    LogEst *a = pI
1c160 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b  dx->aiRowLogEst;
1c170 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d  .  int nCopy = M
1c180 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61  IN(ArraySize(aVa
1c190 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l), pIdx->nKeyCo
1c1a0 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  l);.  int i;..  
1c1b0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
1c1c0 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f   entry (number o
1c1d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
1c1e0 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69  dex) to the esti
1c1f0 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62  mated .  ** numb
1c200 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1c210 65 20 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20  e table. Or 10, 
1c220 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  if the estimated
1c230 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1c240 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  .  ** in the tab
1c250 6c 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  le is less than 
1c260 74 68 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d  that.  */.  a[0]
1c270 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1c280 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  >nRowLogEst;.  i
1c290 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1c2a0 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61  ] = 33;        a
1c2b0 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74  ssert( 33==sqlit
1c2c0 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a  e3LogEst(10) );.
1c2d0 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
1c2e0 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20  hat a[1] is 10, 
1c2f0 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20  a[2] is 9, a[3] 
1c300 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c  is 8, a[4] is 7,
1c310 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20   a[5] is.  ** 6 
1c320 61 6e 64 20 65 61 63 68 20 73 75 62 73 65 71 75  and each subsequ
1c330 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e  ent value (if an
1c340 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d  y) is 5.  */.  m
1c350 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61  emcpy(&a[1], aVa
1c360 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28  l, nCopy*sizeof(
1c370 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28  LogEst));.  for(
1c380 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49  i=nCopy+1; i<=pI
1c390 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
1c3a0 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33  ){.    a[i] = 23
1c3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 32 33 3d       assert( 23=
1c3d0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35  =sqlite3LogEst(5
1c3e0 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ) );.  }..  asse
1c3f0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
1c400 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28  gEst(1) );.  if(
1c410 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1c420 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e  Idx) ) a[pIdx->n
1c430 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a  KeyCol] = 0;.}..
1c440 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1c450 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
1c460 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
1c470 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
1c480 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
1c490 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
1c4a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
1c4b0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
1c4c0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
1c4d0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
1c4e0 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
1c4f0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1c500 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
1c510 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c520 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1c530 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   iDb;..  assert(
1c540 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1c550 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63   );   /* Never c
1c560 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72  alled with prior
1c570 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28   errors */.  if(
1c580 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1c590 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
1c5a0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1c5b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
1c5c0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
1c5d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c5e0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1c5f0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1c600 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c610 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
1c620 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1c630 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
1c640 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
1c650 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1c660 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
1c670 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
1c680 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
1c690 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1c6a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1c6b0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
1c6c0 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
1c6d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1c6e0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
1c6f0 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
1c700 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1c710 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a  atabase);.    }.
1c720 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
1c730 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
1c740 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c750 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
1c760 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1c770 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1c780 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73  _APPDEF ){.    s
1c790 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c7a0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
1c7b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
1c7c0 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
1c7d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1c7e0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
1c7f0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
1c800 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1c810 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1c820 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1c830 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
1c840 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
1c850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c860 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1c870 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1c880 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1c890 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1c8a0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1c8b0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1c8c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1c8d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1c8e0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
1c8f0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
1c900 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
1c910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1c920 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1c930 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
1c940 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
1c950 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1c960 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1c970 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
1c980 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
1c990 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1c9a0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
1c9b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1c9c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1c9d0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
1c9e0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
1c9f0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1ca00 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1ca10 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
1ca20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
1ca30 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
1ca40 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
1ca50 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
1ca60 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
1ca70 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1ca80 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1ca90 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1caa0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1cab0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1cac0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1cad0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1cae0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
1caf0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
1cb00 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
1cb10 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
1cb20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1cb30 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
1cb40 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e  _TABLE(iDb), pIn
1cb50 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1cb60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1cb70 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1cb80 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1cb90 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1cba0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1cbb0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1cbc0 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1cbd0 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1cbe0 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1cbf0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1cc00 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1cc10 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1cc20 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1cc30 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1cc40 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1cc50 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1cc60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1cc70 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1cc80 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1cc90 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1cca0 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1ccb0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1ccc0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1ccd0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1cce0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1ccf0 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1cd00 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1cd10 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1cd20 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1cd30 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1cd40 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1cd50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1cd60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1cd70 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1cd80 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1cd90 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1cda0 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1cdb0 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1cdc0 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1cdd0 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1cde0 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1cdf0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1ce00 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1ce10 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1ce20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1ce30 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1ce40 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1ce50 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1ce60 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1ce70 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1ce80 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1ce90 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1cea0 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1ceb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1cec0 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1ced0 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1cee0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1cef0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1cf00 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1cf10 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1cf20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1cf30 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1cf40 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1cf50 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1cf60 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1cf70 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1cf80 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1cf90 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1cfa0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1cfb0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1cfc0 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1cfd0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1cfe0 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1cff0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1d000 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1d010 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1d020 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1d030 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1d040 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1d050 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1d060 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1d070 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1d080 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1d090 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1d0a0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1d0b0 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1d0c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1d0d0 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1d0e0 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1d0f0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
1d100 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
1d110 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
1d120 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
1d130 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
1d140 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
1d150 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1d160 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
1d170 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
1d180 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1d190 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
1d1a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1d1b0 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
1d1c0 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
1d1d0 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
1d1e0 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
1d1f0 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
1d200 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
1d210 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
1d220 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
1d230 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1d240 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1d250 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1d260 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
1d270 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1d280 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
1d290 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
1d2a0 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
1d2b0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1d2c0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
1d2d0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
1d2e0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
1d2f0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1d300 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
1d310 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
1d320 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1d330 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1d340 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1d350 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1d360 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
1d370 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d380 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d390 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
1d3a0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1d3b0 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
1d3c0 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
1d3d0 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
1d3e0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
1d3f0 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
1d400 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
1d410 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1d420 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1d430 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1d440 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1d450 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1d460 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1d470 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
1d480 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1d490 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
1d4a0 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
1d4b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
1d4c0 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1d4d0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1d4e0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1d4f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d500 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1d510 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1d520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1d530 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1d540 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
1d550 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1d560 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1d570 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
1d580 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1d590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d5a0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
1d5b0 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
1d5c0 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
1d5d0 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
1d5e0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1d5f0 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
1d600 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
1d610 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
1d620 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1d630 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1d640 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1d650 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1d660 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1d670 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1d680 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
1d690 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
1d6a0 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1d6b0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1d6c0 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74  ../*.** Expand t
1d6d0 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
1d6e0 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ed for the given
1d6f0 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
1d700 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e  by.** creating n
1d710 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20  Extra new slots 
1d720 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74  beginning at iSt
1d730 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20  art.  iStart is 
1d740 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e  zero based..** N
1d750 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72  ew slots are zer
1d760 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  oed..**.** For e
1d770 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
1d780 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61  a SrcList initia
1d790 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f  lly contains two
1d7a0 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a   entries: A,B..*
1d7b0 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65  * To append 3 ne
1d7c0 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74  w entries onto t
1d7d0 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a  he end, do this:
1d7e0 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
1d7f0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1d800 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c  db, pSrclist, 3,
1d810 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72   2);.**.** After
1d820 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20   the call above 
1d830 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  it would contain
1d840 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69  :  A, B, nil, ni
1d850 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68  l, nil..** If th
1d860 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e  e iStart argumen
1d870 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73  t had been 1 ins
1d880 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20  tead of 2, then 
1d890 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f  the result.** wo
1d8a0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20  uld have been:  
1d8b0 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  A, nil, nil, nil
1d8c0 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64  , B.  To prepend
1d8d0 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a   the new slots,.
1d8e0 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61  ** the iStart va
1d8f0 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20  lue would be 0. 
1d900 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e   The result then
1d910 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69   would.** be: ni
1d920 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20  l, nil, nil, A, 
1d930 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  B..**.** If a me
1d940 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1d950 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73  fails the SrcLis
1d960 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  t is unchanged. 
1d970 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c   The.** db->mall
1d980 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69  ocFailed flag wi
1d990 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75  ll be set to tru
1d9a0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
1d9b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1d9c0 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20  arge(.  sqlite3 
1d9d0 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  *db,       /* Da
1d9e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1d9f0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f  n to notify of O
1da00 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53  OM errors */.  S
1da10 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1da20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
1da30 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
1da40 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
1da50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1da60 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
1da70 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
1da80 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
1da90 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
1daa0 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
1dab0 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
1dac0 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
1dad0 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
1dae0 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
1daf0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1db00 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1db10 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
1db20 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
1db30 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1db40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1db50 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
1db60 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1db70 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
1db80 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
1db90 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63  .  if( (u32)pSrc
1dba0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
1dbb0 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
1dbc0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
1dbd0 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
1dbe0 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  = pSrc->nSrc+nEx
1dbf0 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1dc00 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
1dc10 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1dc20 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
1dc30 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1dc40 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
1dc50 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
1dc60 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
1dc70 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1dc80 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1dc90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1dca0 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
1dcb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
1dcc0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
1dcd0 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
1dce0 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
1dcf0 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
1dd00 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
1dd10 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
1dd20 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74  c->nAlloc = nGot
1dd30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1dd40 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1dd50 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1dd60 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1dd70 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1dd80 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1dd90 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1dda0 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1ddb0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1ddc0 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1ddd0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1dde0 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
1ddf0 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1de00 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1de10 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1de20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1de30 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1de40 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1de50 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1de60 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1de70 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1de80 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1de90 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1dea0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1deb0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1dec0 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1ded0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1dee0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1def0 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1df00 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1df10 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1df20 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1df30 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1df40 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1df50 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1df60 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1df70 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1df80 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1df90 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1dfa0 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1dfb0 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1dfc0 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1dfd0 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1dfe0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1dff0 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1e000 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1e010 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1e020 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1e030 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1e040 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1e050 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1e060 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1e070 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1e080 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1e090 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1e0a0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1e0b0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1e0c0 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1e0d0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1e0e0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1e0f0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1e100 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1e110 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1e120 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1e130 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1e140 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1e150 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1e160 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1e170 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1e180 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1e190 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1e1a0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1e1b0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1e1c0 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1e1d0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1e1e0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1e1f0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1e200 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1e210 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1e220 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e230 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1e240 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1e250 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1e260 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1e270 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1e280 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1e290 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1e2a0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1e2b0 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1e2c0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1e2d0 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1e2e0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1e2f0 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1e300 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1e310 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1e320 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1e330 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e340 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1e350 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1e360 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1e370 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1e380 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1e390 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1e3a0 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1e3b0 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1e3c0 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1e3d0 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1e3e0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1e3f0 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1e400 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1e410 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1e420 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1e430 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1e440 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1e450 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1e460 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1e470 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1e480 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1e490 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1e4a0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1e4b0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1e4c0 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1e4d0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1e4e0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1e4f0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1e500 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1e510 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1e520 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1e530 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1e540 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1e550 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1e560 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1e570 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1e580 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1e590 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e5a0 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1e5b0 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1e5c0 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1e5d0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1e5e0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1e5f0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1e600 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1e610 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1e620 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1e630 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
1e640 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1e650 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1e660 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1e670 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1e680 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20      pList->nSrc 
1e690 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  = 0;.  }.  pList
1e6a0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1e6b0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69  tEnlarge(db, pLi
1e6c0 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
1e6d0 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  rc);.  if( db->m
1e6e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1e6f0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1e700 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1e710 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1e720 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1e730 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
1e740 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
1e750 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
1e760 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
1e770 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1e780 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
1e790 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f  tabase ){.    To
1e7a0 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
1e7b0 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
1e7c0 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
1e7d0 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
1e7e0 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
1e7f0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
1e800 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1e810 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
1e820 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1e830 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1e840 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
1e850 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  se);.  return pL
1e860 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
1e870 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
1e880 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
1e890 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1e8a0 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
1e8b0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e8c0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
1e8d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1e8e0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1e8f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1e900 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1e910 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
1e920 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
1e930 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e940 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1e950 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
1e960 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
1e970 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
1e980 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1e990 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
1e9a0 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
1e9b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
1e9c0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
1e9d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
1e9e0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1e9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ea00 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1ea10 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
1ea20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
1ea30 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
1ea40 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ea50 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
1ea60 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
1ea70 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
1ea80 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
1ea90 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1eaa0 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1eab0 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
1eac0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1ead0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1eae0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1eaf0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1eb00 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
1eb10 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1eb20 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1eb30 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1eb40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1eb50 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
1eb60 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
1eb70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1eb80 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1eb90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1eba0 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
1ebb0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1ebc0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1ebd0 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1ebe0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a  (db, pItem->u1.z
1ebf0 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1ec00 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1ec10 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65  TabFunc ) sqlite
1ec20 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1ec30 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  db, pItem->u1.pF
1ec40 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  uncArg);.    sql
1ec50 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
1ec60 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  db, pItem->pTab)
1ec70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1ec80 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
1ec90 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
1eca0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1ecb0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1ecc0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
1ecd0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1ece0 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
1ecf0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1ed00 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
1ed10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ed20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1ed30 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
1ed40 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
1ed50 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
1ed60 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
1ed70 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
1ed80 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1ed90 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
1eda0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1edb0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1edc0 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
1edd0 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
1ede0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
1edf0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
1ee00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
1ee10 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1ee20 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
1ee30 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1ee40 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
1ee50 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
1ee60 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
1ee70 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
1ee80 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
1ee90 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
1eea0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
1eeb0 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
1eec0 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
1eed0 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68  has an alias, th
1eee0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
1eef0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
1ef00 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
1ef10 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
1ef20 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
1ef30 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
1ef40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
1ef50 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
1ef60 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
1ef70 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
1ef80 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
1ef90 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
1efa0 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
1efb0 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
1efc0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1efd0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
1efe0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
1eff0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
1f000 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
1f010 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
1f020 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
1f030 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
1f040 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
1f050 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1f060 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
1f070 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1f080 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
1f090 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1f0a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1f0b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1f0c0 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
1f0d0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1f0e0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
1f0f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1f100 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
1f110 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1f120 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
1f130 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1f140 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1f150 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
1f160 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f170 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
1f180 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
1f190 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
1f1a0 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
1f1b0 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
1f1c0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1f1d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
1f1e0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
1f1f0 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
1f200 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
1f210 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
1f220 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
1f230 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
1f240 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1f250 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
1f260 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
1f270 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
1f280 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
1f290 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f2a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f2b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1f2c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1f2d0 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55  !p && (pOn || pU
1f2e0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  sing) ){.    sql
1f2f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1f300 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61  rse, "a JOIN cla
1f310 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
1f320 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20  before %s", .   
1f330 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a     (pOn ? "ON" :
1f340 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b   "USING").    );
1f350 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
1f360 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
1f370 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72  .  p = sqlite3Sr
1f380 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1f390 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61  p, pTable, pData
1f3a0 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
1f3b0 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53  0 || NEVER(p->nS
1f3c0 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f  rc==0) ){.    go
1f3d0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1f3e0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rror;.  }.  pIte
1f3f0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
1f400 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
1f410 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69  pAlias!=0 );.  i
1f420 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  f( pAlias->n ){.
1f430 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
1f440 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
1f450 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c  romToken(db, pAl
1f460 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  ias);.  }.  pIte
1f470 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m->pSelect = pSu
1f480 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d  bquery;.  pItem-
1f490 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49  >pOn = pOn;.  pI
1f4a0 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55  tem->pUsing = pU
1f4b0 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sing;.  return p
1f4c0 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  ;.. append_from_
1f4d0 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28  error:.  assert(
1f4e0 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p==0 );.  sqlit
1f4f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1f500 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOn);.  sqlite3
1f510 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1f520 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69   pUsing);.  sqli
1f530 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1f540 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a  db, pSubquery);.
1f550 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1f560 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45  *.** Add an INDE
1f570 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
1f580 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20  DEXED clause to 
1f590 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1f5a0 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d  y added .** elem
1f5b0 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
1f5c0 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  e-list passed as
1f5d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1f5e0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1f5f0 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
1f600 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61  xedBy(Parse *pPa
1f610 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1f620 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64   Token *pIndexed
1f630 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  By){.  assert( p
1f640 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a  IndexedBy!=0 );.
1f650 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59    if( p && ALWAY
1f660 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a  S(p->nSrc>0) ){.
1f670 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1f680 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1f690 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1f6a0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1f6b0 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  Item->fg.notInde
1f6c0 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  xed==0 );.    as
1f6d0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
1f6e0 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29  isIndexedBy==0 )
1f6f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1f700 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1f710 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  c==0 );.    if( 
1f720 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
1f730 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
1f740 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
1f750 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
1f760 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
1f770 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
1f780 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
1f790 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
1f7a0 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
1f7b0 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  /.      pItem->f
1f7c0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  g.notIndexed = 1
1f7d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f7e0 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e     pItem->u1.zIn
1f7f0 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65  dexedBy = sqlite
1f800 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1f810 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
1f820 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49  xedBy);.      pI
1f830 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1f840 64 42 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31  dBy = (pItem->u1
1f850 2e 7a 49 6e 64 65 78 65 64 42 79 21 3d 30 29 3b  .zIndexedBy!=0);
1f860 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1f870 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74  .** Add the list
1f880 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67   of function arg
1f890 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72  uments to the Sr
1f8a0 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20  cList entry for 
1f8b0 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65  a.** table-value
1f8c0 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  d-function..*/.v
1f8d0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1f8e0 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73 65  stFuncArgs(Parse
1f8f0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1f900 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a  t *p, ExprList *
1f910 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20  pList){.  if( p 
1f920 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
1f930 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1f940 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
1f950 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
1f960 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49  ( pItem->fg.notI
1f970 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ndexed==0 );.   
1f980 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1f990 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d  fg.isIndexedBy==
1f9a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f9b0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
1f9c0 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Func==0 );.    p
1f9d0 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1f9e0 67 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70  g = pList;.    p
1f9f0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1fa00 6e 63 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 1;.  }else{
1fa10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fa20 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
1fa30 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
1fa40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1fa50 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
1fa60 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
1fa70 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
1fa80 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
1fa90 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
1faa0 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1fab0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
1fac0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1fad0 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
1fae0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
1faf0 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
1fb00 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
1fb10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
1fb20 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
1fb30 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
1fb40 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
1fb50 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
1fb60 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
1fb70 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
1fb80 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
1fb90 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1fba0 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
1fbb0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
1fbc0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
1fbd0 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
1fbe0 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
1fbf0 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
1fc00 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
1fc10 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
1fc20 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
1fc30 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1fc40 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
1fc50 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
1fc60 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
1fc70 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
1fc80 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
1fc90 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
1fca0 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
1fcb0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
1fcc0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
1fcd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1fce0 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
1fcf0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1fd00 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69    p->a[i].fg.joi
1fd10 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
1fd20 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ].fg.jointype;. 
1fd30 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
1fd40 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  .fg.jointype = 0
1fd50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
1fd60 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1fd70 65 20 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74  e for a BEGIN st
1fd80 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1fd90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
1fda0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1fdb0 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
1fdc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1fdd0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
1fde0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1fdf0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1fe00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1fe10 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1fe20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1fe30 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1fe40 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1fe50 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
1fe60 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1fe70 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1fe80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1fe90 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
1fea0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1feb0 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
1fec0 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
1fed0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1fee0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1fef0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ff00 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
1ff10 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
1ff20 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20  SIVE)+1);.      
1ff30 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
1ff40 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20  tree(v, i);.    
1ff50 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
1ff60 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1ff70 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a  AutoCommit);.}..
1ff80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1ff90 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43  DBE code for a C
1ffa0 4f 4d 4d 49 54 20 73 74 61 74 65 6d 65 6e 74 2e  OMMIT statement.
1ffb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ffc0 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
1ffd0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1ffe0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  {.  Vdbe *v;..  
1fff0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
20000 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20010 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
20020 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
20030 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
20040 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
20050 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  N, "COMMIT", 0, 
20060 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
20070 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
20080 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20090 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
200a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
200b0 64 4f 70 31 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp1(v, OP_AutoC
200c0 6f 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d  ommit, 1);.  }.}
200d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
200e0 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
200f0 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d   ROLLBACK statem
20100 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
20110 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
20120 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
20130 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
20140 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
20150 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
20160 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
20170 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
20180 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
20190 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
201a0 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
201b0 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
201c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
201d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
201e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
201f0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
20200 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20210 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
20220 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
20230 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20240 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
20250 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
20260 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
20270 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
20280 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
20290 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
202a0 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
202b0 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
202c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
202d0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
202e0 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
202f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
20300 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
20310 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
20320 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
20330 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
20340 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20350 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
20360 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
20370 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
20380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
20390 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
203a0 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
203b0 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
203c0 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
203d0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
203e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
203f0 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
20400 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
20410 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
20420 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
20430 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20440 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
20450 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
20460 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
20470 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
20480 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
20490 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
204a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
204b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
204c0 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
204d0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
204e0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
204f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
20500 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
20510 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
20520 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
20530 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
20540 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
20550 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
20560 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
20570 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
20580 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20590 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
205a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
205b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
205c0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
205d0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
205e0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
205f0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
20600 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
20610 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
20620 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
20630 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
20640 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
20650 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
20660 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
20670 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
20680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
20690 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
206a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
206b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
206c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
206d0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
206e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
206f0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
20700 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
20710 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
20720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20750 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
20760 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
20770 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
20780 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
20790 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
207a0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
207b0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
207c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
207d0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
207e0 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
207f0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
20800 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
20810 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
20820 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
20830 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
20840 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
20850 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
20860 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
20870 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
20880 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20890 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
208a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
208b0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
208c0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
208d0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
208e0 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20  verified.** for 
208f0 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54  database iDb.  T
20900 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61  he code to actua
20910 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73  lly verify the s
20920 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20  chema cookie.** 
20930 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68  will occur at th
20940 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70  e end of the top
20950 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20  -level VDBE and 
20960 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
20970 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73  d.** later, by s
20980 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
20990 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
209a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
209b0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
209c0 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
209d0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
209e0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
209f0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20a00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
20a10 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b  = pToplevel->db;
20a20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
20a30 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
20a40 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
20a50 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
20a60 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
20a70 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
20a80 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
20a90 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D+2 );.  assert(
20aa0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
20ab0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
20ac0 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d   0) );.  if( DbM
20ad0 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65  askTest(pTopleve
20ae0 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69  l->cookieMask, i
20af0 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62  Db)==0 ){.    Db
20b00 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65  MaskSet(pTopleve
20b10 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69  l->cookieMask, i
20b20 44 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76  Db);.    pToplev
20b30 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  el->cookieValue[
20b40 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
20b50 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
20b60 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
20b70 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
20b80 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
20b90 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
20ba0 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
20bb0 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
20bc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
20bd0 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
20be0 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
20bf0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
20c00 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
20c10 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
20c20 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
20c30 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
20c40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20c50 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
20c60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
20c70 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
20c80 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
20c90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
20ca0 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
20cb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20cc0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
20cd0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
20ce0 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
20cf0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
20d00 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
20d10 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
20d20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
20d30 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29  Db, pDb->zName))
20d40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20d50 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
20d60 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
20d70 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
20d80 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
20d90 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
20da0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
20db0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
20dc0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
20dd0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
20de0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
20df0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
20e00 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
20e10 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
20e20 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
20e30 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
20e40 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
20e50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
20e60 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
20e70 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
20e80 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
20e90 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
20ea0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
20eb0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
20ec0 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
20ed0 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
20ee0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
20ef0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
20f00 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
20f10 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
20f20 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
20f30 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
20f40 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
20f50 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
20f60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
20f70 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
20f80 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
20f90 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
20fa0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
20fb0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
20fc0 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
20fd0 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
20fe0 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
20ff0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
21000 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
21010 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
21020 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
21030 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
21040 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
21050 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
21060 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
21070 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21080 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21090 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
210a0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
210b0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
210c0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44 62  arse, iDb);.  Db
210d0 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65  MaskSet(pTopleve
210e0 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69 44  l->writeMask, iD
210f0 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
21100 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d  >isMultiWrite |=
21110 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d   setStatement;.}
21120 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
21130 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
21140 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ent currently un
21150 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
21160 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20   might write.** 
21170 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e  more than one en
21180 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65  try (example: de
21190 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74  leting one row t
211a0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e  hen inserting an
211b0 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74  other,.** insert
211c0 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ing multiple row
211d0 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72  s in a table, or
211e0 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77   inserting a row
211f0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
21200 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62  es.).** If an ab
21210 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  ort occurs after
21220 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77   some of these w
21230 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c  rites have compl
21240 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69  eted, then it wi
21250 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  ll.** be necessa
21260 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63  ry to undo the c
21270 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e  ompleted writes.
21280 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21290 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65  MultiWrite(Parse
212a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
212b0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
212c0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
212d0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
212e0 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
212f0 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a  tiWrite = 1;.}..
21300 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  /* .** The code 
21310 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20  generator calls 
21320 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20  this routine if 
21330 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  is discovers tha
21340 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  t it is.** possi
21350 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73  ble to abort a s
21360 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74  tatement prior t
21370 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49  o completion.  I
21380 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70  n order to .** p
21390 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72  erform this abor
213a0 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70  t without corrup
213b0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
213c0 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  e, we need to ma
213d0 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20  ke.** sure that 
213e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
213f0 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
21400 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
21410 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63  ction..**.** Tec
21420 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c  hnically, we onl
21430 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68  y need to set th
21440 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20  e mayAbort flag 
21450 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74  if the.** isMult
21460 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20  iWrite flag was 
21470 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20  previously set. 
21480 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65   There is a time
21490 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73   dependency.** s
214a0 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f  uch that the abo
214b0 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66  rt must occur af
214c0 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69  ter the multiwri
214d0 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a  te.  This makes.
214e0 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e  ** some statemen
214f0 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65  ts involving the
21500 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63   REPLACE conflic
21510 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
21520 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c  orithm.** go a l
21530 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42  ittle faster.  B
21540 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74  ut taking advant
21550 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65  age of this time
21560 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d   dependency.** m
21570 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66  akes it more dif
21580 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20  ficult to prove 
21590 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73  that the code is
215a0 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a   correct (in .**
215b0 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20   particular, it 
215c0 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
215d0 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65   writing an effe
215e0 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ctive.** impleme
215f0 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74  ntation of sqlit
21600 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
21610 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61  ()) and so we ha
21620 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20  ve chosen.** to 
21630 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f  take the safe ro
21640 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65  ute and skip the
21650 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
21660 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61  /.void sqlite3Ma
21670 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50  yAbort(Parse *pP
21680 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
21690 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
216a0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
216b0 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
216c0 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20  level->mayAbort 
216d0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  = 1;.}../*.** Co
216e0 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68  de an OP_Halt th
216f0 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64  at causes the vd
21700 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  be to return an 
21710 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
21720 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20  T.** error. The 
21730 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
21740 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  r determines whi
21750 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74  ch (if any) of t
21760 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
21770 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74  and/or current t
21780 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
21790 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f  lled back..*/.vo
217a0 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  id sqlite3HaltCo
217b0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
217c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
217d0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
217e0 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64   */.  int errCod
217f0 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65 6e  e,      /* exten
21800 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ded error code *
21810 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
21820 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
21830 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  int type */.  ch
21840 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20 20  ar *p4,         
21850 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
21860 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65 2c   */.  i8 p4type,
21870 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53 54          /* P4_ST
21880 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e 53  ATIC or P4_TRANS
21890 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35 45  IENT */.  u8 p5E
218a0 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20 50  rrmsg       /* P
218b0 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a 2f  5_ErrMsg type */
218c0 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
218d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
218e0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
218f0 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29  ( (errCode&0xff)
21900 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
21910 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45  INT );.  if( onE
21920 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
21930 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
21940 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
21950 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
21960 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
21970 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72  t, errCode, onEr
21980 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
21990 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pe);.  sqlite3Vd
219a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
219b0 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
219c0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
219d0 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
219e0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
219f0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
21a00 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
21a10 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
21a20 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
21a30 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
21a40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
21a50 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
21a60 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
21a70 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
21a80 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
21a90 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
21aa0 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
21ab0 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
21ac0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
21ad0 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
21ae0 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
21af0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
21b00 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
21b10 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
21b20 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64 62  rMsg, pParse->db
21b30 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
21b40 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  if( pIdx->aColEx
21b50 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
21b60 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73 67  3XPrintf(&errMsg
21b70 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20  , "index '%q'", 
21b80 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
21b90 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a  }else{.    for(j
21ba0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
21bb0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
21bc0 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
21bd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
21be0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
21bf0 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  );.      zCol = 
21c00 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
21c10 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
21c20 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ame;.      if( j
21c30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
21c40 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
21c50 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20  , ", ", 2);.    
21c60 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
21c70 28 26 65 72 72 4d 73 67 2c 20 22 25 73 2e 25 73  (&errMsg, "%s.%s
21c80 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
21c90 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zCol);.    }.  }
21ca0 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
21cb0 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
21cc0 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  &errMsg);.  sqli
21cd0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
21ce0 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49  t(pParse, .    I
21cf0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
21d00 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f  (pIdx) ? SQLITE_
21d10 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
21d20 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20  RYKEY .         
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53     : SQLITE_CONS
21d50 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20  TRAINT_UNIQUE,. 
21d60 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72     onError, zErr
21d70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35  , P4_DYNAMIC, P5
21d80 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
21d90 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e);.}.../*.** Co
21da0 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
21db0 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20  e to non-unique 
21dc0 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rowid..*/.void s
21dd0 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74  qlite3RowidConst
21de0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
21df0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
21e00 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
21e10 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
21e20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
21e30 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
21e40 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65  rithm */.  Table
21e50 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20   *pTab       /* 
21e60 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  The table with t
21e70 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  he non-unique ro
21e80 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61  wid */ .){.  cha
21e90 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72  r *zMsg;.  int r
21ea0 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  c;.  if( pTab->i
21eb0 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a  PKey>=0 ){.    z
21ec0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
21ed0 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
21ee0 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
21ef0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
21f20 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
21f30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21f40 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
21f50 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b  ARYKEY;.  }else{
21f60 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
21f70 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
21f80 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64  e->db, "%s.rowid
21f90 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
21fa0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21fb0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
21fc0 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  D;.  }.  sqlite3
21fd0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
21fe0 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72  Parse, rc, onErr
21ff0 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  or, zMsg, P4_DYN
22000 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20  AMIC,.          
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35                P5
22020 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
22030 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  e);.}../*.** Che
22040 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
22050 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
22060 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
22070 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
22080 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
22090 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
220a0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
220b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
220c0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
220d0 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
220e0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
220f0 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
22100 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
22110 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c  .  assert( zColl
22120 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
22130 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
22140 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
22150 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
22160 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
22170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
22180 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69  =0 || pIndex->ai
22190 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20  Column[i]<0 );. 
221a0 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
221b0 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26  iColumn[i]>=0 &&
221c0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
221d0 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  mp(z, zColl) ){.
221e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
221f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22200 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
22210 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
22220 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
22230 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
22240 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
22250 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
22260 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
22270 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
22280 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
22290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
222a0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
222b0 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
222c0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
222d0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
222e0 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
222f0 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
22300 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
22310 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
22320 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22330 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
22340 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
22350 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
22360 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
22370 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  ){.    if( zColl
22380 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
22390 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
223a0 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  dex) ){.      in
223b0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
223c0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
223d0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
223e0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
223f0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
22400 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
22410 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
22420 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
22430 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
22440 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
22450 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
22460 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
22470 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
22480 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
22490 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
224a0 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
224b0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
224c0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
224d0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
224e0 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
224f0 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
22500 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
22510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
22520 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
22530 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
22540 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
22550 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
22560 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
22590 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
225a0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
225b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
225c0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
225d0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
225e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
225f0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
22600 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22610 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
22620 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
22630 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
22640 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
22650 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
22660 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
22670 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
22680 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22690 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
226a0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
226b0 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
226c0 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  ;  /* Needed for
226d0 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a   schema access *
226e0 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  /.  for(iDb=0, p
226f0 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
22700 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
22710 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  pDb++){.    asse
22720 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20  rt( pDb!=0 );.  
22730 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
22740 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
22750 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
22760 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
22770 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
22780 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
22790 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
227a0 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
227b0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
227c0 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
227d0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
227e0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
227f0 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
22800 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
22810 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
22820 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
22840 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
22850 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
22870 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
22880 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
22890 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
228a0 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
228b0 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
228c0 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
228d0 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
228e0 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
228f0 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
22900 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
22910 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
22920 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
22930 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
22940 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
22950 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
22960 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
22970 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
22980 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
22990 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
229a0 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
229b0 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
229c0 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
229d0 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
229e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
229f0 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
22a00 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
22a10 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
22a20 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
22a30 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
22a40 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
22a50 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
22a60 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
22a70 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
22a80 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
22ab0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
22ac0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22ad0 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
22ae0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
22af0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
22b00 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
22b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
22b20 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
22b30 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
22b40 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
22b50 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
22b60 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
22b70 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
22b80 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
22b90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
22ba0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
22bb0 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
22bc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
22bd0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
22be0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22bf0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
22c00 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
22c10 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22c20 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
22c30 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
22c40 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
22c50 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
22c60 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
22c70 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
22c80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
22c90 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
22ca0 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
22cb0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
22cc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
22cd0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
22ce0 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
22cf0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
22d00 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
22d10 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
22d20 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
22d30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
22d40 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
22d50 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
22d60 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
22d70 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
22d80 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
22d90 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
22da0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
22db0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
22dc0 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
22dd0 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
22de0 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
22df0 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
22e00 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
22e10 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
22e20 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
22e30 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
22e40 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
22e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
22e60 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
22e70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
22e80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22e90 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
22ea0 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
22eb0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
22ec0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
22ed0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
22ee0 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
22ef0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
22f00 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
22f10 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
22f20 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
22f30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
22f40 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
22f50 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
22f60 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
22f70 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
22f80 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
22f90 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
22fa0 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
22fb0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
22fc0 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74  (db, z);.    ret
22fd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
22fe0 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
22ff0 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
23000 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
23010 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20  e(db, z);.  if( 
23020 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
23030 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
23040 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
23050 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
23060 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
23070 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
23080 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
23090 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
230a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
230b0 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
230c0 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
230d0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
230e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
230f0 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e  * Return a KeyIn
23100 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
23110 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
23120 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49   for the given I
23130 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
23140 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
23150 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 69  e for an index i
23160 73 20 63 61 63 68 65 64 20 69 6e 20 74 68 65 20  s cached in the 
23170 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Index object..**
23180 20 53 6f 20 74 68 65 72 65 20 6d 69 67 68 74 20   So there might 
23190 62 65 20 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  be multiple refe
231a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 72 65  rences to the re
231b0 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20  turned pointer. 
231c0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73   The.** caller s
231d0 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f  hould not try to
231e0 20 6d 6f 64 69 66 79 20 74 68 65 20 4b 65 79 49   modify the KeyI
231f0 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  nfo object..**.*
23200 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  * The caller sho
23210 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
23220 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29  e3KeyInfoUnref()
23230 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
23240 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20   object.** when 
23250 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  it has finished 
23260 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79  using it..*/.Key
23270 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
23280 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73  InfoOfIndex(Pars
23290 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
232a0 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
232b0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
232c0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
232d0 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
232e0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49  >nKeyCol;.  KeyI
232f0 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28  nfo *pKey;.  if(
23300 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
23310 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
23320 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
23330 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20  l ){.    pKey = 
23340 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
23350 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
23360 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29  nKey, nCol-nKey)
23370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23380 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
23390 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
233a0 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a  ->db, nCol, 0);.
233b0 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29    }.  if( pKey )
233c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
233d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
233e0 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b  iteable(pKey) );
233f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23400 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
23410 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
23420 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
23430 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65  ll[i];.      pKe
23440 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  y->aColl[i] = zC
23450 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42  oll==sqlite3StrB
23460 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20  INARY ? 0 :.    
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
23490 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
234a0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70   zColl);.      p
234b0 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
234c0 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  i] = pIdx->aSort
234d0 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a  Order[i];.    }.
234e0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
234f0 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  nErr ){.      sq
23500 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
23510 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
23520 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
23530 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
23540 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
23550 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
23560 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23570 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
23580 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
23590 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
235a0 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
235b0 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
235c0 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
235d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
235e0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
235f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
23600 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
23610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
23620 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
23630 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
23640 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
23650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
23660 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
23670 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
23680 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
23690 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
236a0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
236b0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
236c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
236d0 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
236e0 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
236f0 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
23700 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
23710 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23720 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
23730 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
23740 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
23750 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
23760 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
23770 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
23780 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
23790 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
237a0 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
237b0 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
237c0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
237d0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
237e0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
237f0 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
23800 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23810 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
23820 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
23830 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
23840 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
23850 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
23860 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
23870 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23880 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
23890 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
238a0 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
238b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
238c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
238d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
238e0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  e = sizeof(*pWit
238f0 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69  h) + (sizeof(pWi
23900 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74  th->a[1]) * pWit
23910 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e  h->nCte);.    pN
23920 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
23930 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c  alloc(db, pWith,
23940 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
23950 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  {.    pNew = sql
23960 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
23970 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69  (db, sizeof(*pWi
23980 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  th));.  }.  asse
23990 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20  rt( (pNew!=0 && 
239a0 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d  zName!=0) || db-
239b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
239c0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
239d0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
239e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
239f0 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
23a00 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
23a10 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
23a20 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
23a30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23a40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
23a50 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
23a60 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
23a70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
23a80 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
23a90 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
23aa0 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
23ab0 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
23ac0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
23ad0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
23ae0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
23af0 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
23b00 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
23b10 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
23b20 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
23b30 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
23b40 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
23b50 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
23b60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
23b70 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
23b80 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
23b90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
23ba0 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
23bb0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
23bc0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23bd0 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
23be0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
23bf0 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
23c00 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
23c10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
23c20 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
23c30 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
23c40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
23c50 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
23c60 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
23c70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23c80 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
23c90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23ca0 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
23cb0 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
23cc0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
23cd0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
23ce0 0a                                               .