/ Hex Artifact Content
Login

Artifact 16bbcb166a06b4909a4c645273c474645dbdce66:


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 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8710: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8720: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
8730: 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  cmp(z, p->aCol[i
8740: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
8750: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8760: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
8770: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
8780: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
8790: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
87a0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
87b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
87c0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
87d0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
87e0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
87f0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
8800: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
8810: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
8820: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
8830: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
8840: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
8850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8860: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8870: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
8880: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
8890: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
88a0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
88b0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
88c0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
88d0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
88e0: 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74  ame = z;.  sqlit
88f0: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
8900: 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43  esFromName(p, pC
8910: 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79  ol);. .  if( pTy
8920: 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pe->n==0 ){.    
8930: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
8940: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
8950: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
8960: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
8970: 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42  ity.    ** 'BLOB
8980: 27 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e  '. */.    pCol->
8990: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
89a0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
89b0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
89c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
89d0: 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65  ype = z + sqlite
89e0: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31  3Strlen30(z) + 1
89f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
8a00: 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54  pe, pType->z, pT
8a10: 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79  ype->n);.    zTy
8a20: 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30  pe[pType->n] = 0
8a30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
8a40: 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20  uote(zType);.   
8a50: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8a60: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
8a70: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 26 70 43  yType(zType, &pC
8a80: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20  ol->szEst);.    
8a90: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
8aa0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
8ab0: 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c  E;.  }.  p->nCol
8ac0: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  ++;.  pParse->co
8ad0: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d  nstraintName.n =
8ae0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
8af0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8b00: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8b10: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8b20: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8b30: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8b40: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
8b50: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
8b60: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
8b70: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
8b80: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
8b90: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
8ba0: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
8bb0: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
8bc0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8bd0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8be0: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
8bf0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8c00: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
8c10: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
8c20: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8c30: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8c40: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8c50: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8c60: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8c70: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
8c80: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
8c90: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
8ca0: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
8cb0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
8cc0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
8cd0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
8ce0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
8cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8d00: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
8d10: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
8d20: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
8d30: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
8d40: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
8d50: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
8d60: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8d70: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
8d80: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
8d90: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
8da0: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
8db0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
8dc0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
8dd0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
8de0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
8df0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
8e00: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
8e10: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
8e20: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
8e30: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
8e40: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
8e50: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
8e60: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
8e70: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
8ea0: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
8eb0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8ec0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
8ed0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8ee0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
8ef0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8f00: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
8f10: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
8f20: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8f30: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
8f40: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
8f50: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
8f60: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8f70: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
8f80: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f90: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
8fa0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8fb0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
8fc0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
8fd0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
8fe0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
8ff0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
9000: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9010: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9020: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9030: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9040: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
9050: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
9060: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
9070: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9090: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Char = 0;..  ass
90a0: 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20  ert( zIn!=0 );. 
90b0: 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29   while( zIn[0] )
90c0: 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29  {.    h = (h<<8)
90d0: 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54   + sqlite3UpperT
90e0: 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78  oLower[(*zIn)&0x
90f0: 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a  ff];.    zIn++;.
9100: 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27      if( h==(('c'
9110: 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b  <<24)+('h'<<16)+
9120: 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b  ('a'<<8)+'r') ){
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9140: 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66  CHAR */.      af
9150: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9160: 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72  EXT;.      zChar
9170: 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73   = zIn;.    }els
9180: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
9190: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
91a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
91b0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
91c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
91d0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
91e0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
91f0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
9200: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
9210: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
9220: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9230: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9240: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9250: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
9260: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9270: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9280: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
9290: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
92a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
92b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
92c0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
92d0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
92e0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28  _BLOB;.      if(
92f0: 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a   zIn[0]=='(' ) z
9300: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e  Char = zIn;.#ifn
9310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9320: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
9330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9340: 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('r'<<24)+('e'<
9350: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c  <16)+('a'<<8)+'l
9360: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ')          /* R
9370: 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  EAL */.        &
9380: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9390: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
93a0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
93b0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
93c0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27  lse if( h==(('f'
93d0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
93e0: 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20  ('o'<<8)+'a')   
93f0: 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a         /* FLOA *
9400: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9410: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9420: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9430: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9440: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
9450: 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29  f( h==(('d'<<24)
9460: 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c  +('o'<<16)+('u'<
9470: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9480: 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20    /* DOUB */.   
9490: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
94a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
94b0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
94c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
94d0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
94e0: 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46   if( (h&0x00FFFF
94f0: 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b  FF)==(('i'<<16)+
9500: 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('n'<<8)+'t') ){
9510: 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20      /* INT */.  
9520: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9530: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
9540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9550: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73  .  }..  /* If ps
9560: 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  zEst is not NULL
9570: 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d  , store an estim
9580: 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64  ate of the field
9590: 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a   size.  The.  **
95a0: 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61   estimate is sca
95b0: 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  led so that the 
95c0: 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67  size of an integ
95d0: 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69  er is 1.  */.  i
95e0: 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20  f( pszEst ){.   
95f0: 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20   *pszEst = 1;   
9600: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9610: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9620: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9630: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9640: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9650: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9660: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9670: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9680: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9690: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
96a0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76             int v
96b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
96c0: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
96d0: 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20  2(zChar, &v);.  
96e0: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f            v = v/
96f0: 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  4 + 1;.         
9700: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9710: 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20   = 255;.        
9720: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b      *pszEst = v;
9730: 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52   /* BLOB(k), VAR
9740: 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29  CHAR(k), CHAR(k)
9750: 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f   -> r=(k/4+1) */
9760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9770: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
9780: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
9790: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
97a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
97b0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20    *pszEst = 5;  
97c0: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
97d0: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
97e0: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
97f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
9810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9820: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9830: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9840: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9850: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9860: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9870: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9880: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9890: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
98a0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
98b0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
98c0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
98d0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
98e0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
98f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9900: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9910: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9920: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9930: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9940: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9950: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9960: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9970: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
9980: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
9990: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
99a0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
99b0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
99c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
99d0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
99e0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
99f0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9a00: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
9a10: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
9a20: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
9a30: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9a40: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20  n(pSpan->pExpr, 
9a50: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
9a60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9a70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9a80: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
9a90: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
9aa0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
9ab0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
9ac0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
9ad0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
9ae0: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
9af0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
9b00: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
9b10: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
9b20: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
9b30: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
9b40: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
9b50: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
9b60: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
9b70: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
9b80: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
9b90: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
9ba0: 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20 20       Expr x;.   
9bb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
9bc0: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
9bd0: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Dflt);.      mem
9be0: 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f  set(&x, 0, sizeo
9bf0: 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e 6f  f(x));.      x.o
9c00: 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20 20  p = TK_SPAN;.   
9c10: 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d 20     x.u.zToken = 
9c20: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9c30: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9c40: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9c70: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
9c80: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
9c90: 29 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65 66  ));.      x.pLef
9ca0: 74 20 3d 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  t = pSpan->pExpr
9cb0: 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20  ;.      x.flags 
9cc0: 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  = EP_Skip;.     
9cd0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
9ce0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9cf0: 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45  , &x, EXPRDUP_RE
9d00: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
9d10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78  ite3DbFree(db, x
9d20: 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  .u.zToken);.    
9d30: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
9d40: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53  xprDelete(db, pS
9d50: 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a  pan->pExpr);.}..
9d60: 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20  /*.** Backwards 
9d70: 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61  Compatibility Ha
9d80: 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f  ck:.** .** Histo
9d90: 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f  rical versions o
9da0: 66 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 65  f SQLite accepte
9db0: 64 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c  d strings as col
9dc0: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20  umn names in.** 
9dd0: 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d  indexes and PRIM
9de0: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
9df0: 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55  nts and in UNIQU
9e00: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  E constraints.  
9e10: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
9e20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9e30: 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52  xyz(a,b,c,d,e,PR
9e40: 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55  IMARY KEY('a'),U
9e50: 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f  NIQUE('b','c' CO
9e60: 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20  LLATE trim).**  
9e70: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
9e80: 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27  abc ON xyz('c','
9e90: 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c  d' DESC,'e' COLL
9ea0: 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29  ATE nocase DESC)
9eb0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ;.**.** This is 
9ec0: 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70  goofy.  But to p
9ed0: 72 65 73 65 72 76 65 20 62 61 63 6b 77 61 72 64  reserve backward
9ee0: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
9ef0: 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a  we continue to.*
9f00: 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20 54 68  * accept it.  Th
9f10: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
9f20: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
9f30: 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f  nversion.  It co
9f40: 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78  nverts.** the ex
9f50: 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69  pression given i
9f60: 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66  n its argument f
9f70: 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  rom a TK_STRING 
9f80: 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20  into a TK_ID.** 
9f90: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9fa0: 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53  n is just a TK_S
9fb0: 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70  TRING with an op
9fc0: 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63  tional COLLATE c
9fd0: 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65  lause..** If the
9fe0: 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61   epxression is a
9ff0: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
a000: 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68  an TK_STRING, th
a010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  e expression is.
a020: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ** unchanged..*/
a030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
a040: 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45  ite3StringToId(E
a050: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
a060: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
a070: 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  ){.    p->op = T
a080: 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  K_ID;.  }else if
a090: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  ( p->op==TK_COLL
a0a0: 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d  ATE && p->pLeft-
a0b0: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
a0c0: 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e  {.    p->pLeft->
a0d0: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a  op = TK_ID;.  }.
a0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
a0f0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
a100: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
a110: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
a120: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
a130: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
a140: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
a150: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
a160: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
a170: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
a180: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
a190: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
a1a0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a1b0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
a1c0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
a1d0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
a1e0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
a1f0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
a200: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
a210: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
a220: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
a230: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
a240: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a250: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
a260: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
a270: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
a280: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
a290: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
a2a0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
a2b0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
a2c0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
a2d0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
a2e0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
a2f0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
a300: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
a310: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
a320: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a330: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
a340: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
a350: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
a360: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
a370: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
a380: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
a390: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
a3a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
a3b0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
a3c0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
a3d0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
a3e0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
a3f0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
a400: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
a410: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
a420: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
a430: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a440: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a450: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
a460: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
a470: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
a480: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
a490: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
a4a0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
a4b0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
a4c0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
a4d0: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
a4e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
a4f0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
a500: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
a510: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
a520: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
a530: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
a540: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
a550: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a560: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a570: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
a580: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
a590: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74  l = -1, i;.  int
a5a0: 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54   nTerm;.  if( pT
a5b0: 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c  ab==0 || IN_DECL
a5c0: 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
a5d0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
a5e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
a5f0: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
a600: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
a610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a620: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
a630: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
a640: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
a650: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
a660: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a670: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a680: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
a690: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
a6a0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
a6b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
a6c0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
a6d0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
a6e0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
a6f0: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
a700: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
a710: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
a720: 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31  Y;.    nTerm = 1
a730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
a740: 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Term = pList->nE
a750: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
a760: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
a770: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45  .      Expr *pCE
a780: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
a790: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
a7a0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
a7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7c0: 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  CExpr!=0 );.    
a7d0: 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
a7e0: 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20  oId(pCExpr);.   
a7f0: 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
a800: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
a810: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a820: 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d  zCName = pCExpr-
a830: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
a840: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
a850: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
a860: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
a870: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
a880: 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54  rICmp(zCName, pT
a890: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a8a0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
a8b0: 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
a8c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a8d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
a8e0: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
a8f0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
a900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a910: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
a920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a930: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
a940: 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26  ( nTerm==1.   &&
a950: 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69   pCol.   && sqli
a960: 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74  te3StrICmp(sqlit
a970: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
a980: 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22  l,""), "INTEGER"
a990: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
a9a0: 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder!=SQLITE_SO_
a9b0: 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54  DESC.  ){.    pT
a9c0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
a9d0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
a9e0: 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  onf = (u8)onErro
a9f0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  r;.    assert( a
aa00: 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74  utoInc==0 || aut
aa10: 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  oInc==1 );.    p
aa20: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
aa30: 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f   autoInc*TF_Auto
aa40: 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69  increment;.    i
aa50: 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73  f( pList ) pPars
aa60: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20  e->iPkSortOrder 
aa70: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f  = pList->a[0].so
aa80: 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65  rtOrder;.  }else
aa90: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
aaa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aab0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
aac0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
aad0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
aae0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
aaf0: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
ab00: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
ab10: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ab20: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
ab30: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
ab40: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
ab50: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
ab60: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
ab70: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
ab80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
aba0: 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20  ortOrder, 0);.  
abb0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
abc0: 20 70 2d 3e 69 64 78 54 79 70 65 20 3d 20 53 51   p->idxType = SQ
abd0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
abe0: 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 7d 0a 20  MARYKEY;.    }. 
abf0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
ac00: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
ac10: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
ac20: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
ac30: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
ac40: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
ac50: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
ac60: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
ac70: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
ac80: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
ac90: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
aca0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
acb0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
acc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
acd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ace0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
acf0: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
ad00: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
ad10: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
ad20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ad30: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
ad40: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ad50: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
ad60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ad70: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
ad80: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
ad90: 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42  .   && !sqlite3B
ada0: 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64  treeIsReadonly(d
adb0: 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e  b->aDb[db->init.
adc0: 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20  iDb].pBt).  ){. 
add0: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
ade0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
adf0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
ae00: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
ae10: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
ae20: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
ae30: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
ae40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ae50: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
ae60: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
ae70: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
ae80: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
ae90: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
aea0: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
aeb0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
aec0: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
aed0: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
aee0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
aef0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
af00: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
af10: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
af20: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
af30: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
af40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af50: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
af60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
af70: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
af80: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
af90: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
afa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
afb0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
afc0: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
afd0: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
afe0: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
aff0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b000: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
b010: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
b020: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
b030: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
b040: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b050: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
b060: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
b070: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
b080: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
b090: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
b0a0: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
b0b0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
b0c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b0d0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b0e0: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
b0f0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
b100: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b110: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
b120: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
b130: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
b140: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
b150: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
b160: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
b170: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
b180: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
b190: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
b1a0: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
b1b0: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
b1c0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
b1d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
b1e0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
b1f0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b200: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
b210: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
b220: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
b230: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
b240: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
b250: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
b260: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
b270: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
b280: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
b290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
b2a0: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
b2b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b2c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b2d0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
b2e0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
b2f0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
b300: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
b310: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
b320: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
b330: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
b340: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
b350: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
b360: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
b370: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
b380: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
b390: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
b3a0: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
b3b0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b3c0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
b3d0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
b3e0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
b3f0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
b400: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
b410: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
b420: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
b430: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
b440: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
b450: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
b460: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
b470: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
b480: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
b490: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b4a0: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
b4b0: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
b4c0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
b4d0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
b4e0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
b4f0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
b500: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
b510: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
b520: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b530: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
b540: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
b550: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
b560: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
b570: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b580: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
b590: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
b5a0: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
b5b0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
b5c0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
b5d0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
b5e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b5f0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
b600: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
b610: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
b620: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
b630: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
b640: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
b650: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b660: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
b670: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b680: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
b690: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
b6a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b6b0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
b6c0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
b6d0: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
b6e0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
b6f0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
b700: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
b710: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
b720: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
b730: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
b740: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
b750: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b760: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
b770: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b780: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
b790: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
b7a0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
b7b0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
b7c0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
b7d0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
b7e0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
b7f0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
b800: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
b810: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
b820: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
b830: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
b840: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
b850: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
b860: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
b870: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
b880: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
b890: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
b8a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
b8b0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
b8c0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
b8d0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
b8e0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
b8f0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
b900: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
b910: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
b920: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
b930: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
b940: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
b950: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
b960: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
b970: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
b980: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
b990: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
b9a0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
b9b0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
b9c0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
b9d0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
b9e0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
b9f0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
ba00: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
ba10: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
ba20: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
ba30: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
ba40: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
ba50: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
ba60: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
ba70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ba80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
ba90: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
baa0: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
bab0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
bac0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
bad0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
bae0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
baf0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
bb00: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
bb10: 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ION, .          
bb20: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
bb30: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
bb40: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 29  schema_cookie+1)
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
bb60: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
bb70: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
bb80: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
bb90: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
bba0: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
bbb0: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
bbc0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
bbd0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
bbe0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
bbf0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
bc00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
bc10: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
bc20: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
bc30: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
bc40: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
bc50: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
bc60: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
bc70: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
bc80: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
bc90: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
bca0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
bcb0: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
bcc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
bcd0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
bce0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
bcf0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
bd00: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
bd10: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
bd20: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
bd30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
bd40: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
bd50: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
bd60: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
bd70: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
bd80: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
bd90: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
bda0: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
bdb0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
bdc0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
bdd0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
bde0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
bdf0: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
be00: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
be10: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
be20: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
be30: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
be40: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
be50: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
be60: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
be70: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
be80: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
be90: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
bea0: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
beb0: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
bec0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
bed0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
bee0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
bef0: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
bf00: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
bf10: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
bf20: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
bf30: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
bf40: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
bf50: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
bf60: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
bf70: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
bf80: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
bf90: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
bfa0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
bfb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
bfc0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
bfd0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
bfe0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
bff0: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
c000: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
c010: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
c020: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
c030: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
c040: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
c050: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
c060: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
c070: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
c080: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
c090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c0a0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
c0b0: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
c0c0: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
c0d0: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
c0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c0f0: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
c100: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c110: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
c120: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
c130: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
c140: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
c150: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
c160: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
c170: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
c180: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c190: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
c1a0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
c1b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c1c0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c1d0: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
c1e0: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
c1f0: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
c200: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
c210: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
c220: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
c230: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
c240: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
c250: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
c260: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c270: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c280: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
c290: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
c2a0: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
c2b0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
c2c0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
c2d0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
c2e0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
c2f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
c300: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
c310: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
c320: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c330: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
c340: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
c350: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
c360: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
c370: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
c380: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
c390: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
c3a0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
c3b0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
c3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
c3d0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
c3e0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
c3f0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
c400: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
c410: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
c420: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
c430: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
c440: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
c450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
c460: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
c470: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
c480: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c490: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
c4a0: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
c4b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c4c0: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
c4d0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
c4e0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
c4f0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
c500: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
c510: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c520: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c530: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
c540: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
c550: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
c560: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c570: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
c580: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c590: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
c5a0: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
c5b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c5c0: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
c5d0: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
c5e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c5f0: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
c600: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c610: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
c620: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
c630: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
c640: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c650: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
c660: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
c670: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
c680: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
c690: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
c6a0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
c6b0: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
c6c0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
c6d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
c6e0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c6f0: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c700: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
c710: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
c720: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
c730: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
c740: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
c750: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c760: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c770: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
c780: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c790: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c7a0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
c7b0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c7c0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c7d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c7e0: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
c7f0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c800: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
c810: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
c820: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c830: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c840: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
c850: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
c860: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
c870: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
c880: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
c890: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c8a0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
c8b0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c8c0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
c8d0: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
c8e0: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
c8f0: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
c900: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
c910: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
c920: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
c930: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
c940: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
c950: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
c960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c970: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c980: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
c990: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
c9a0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
c9b0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
c9c0: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
c9d0: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
c9e0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
c9f0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
ca00: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
ca10: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
ca20: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
ca30: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
ca40: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
ca50: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
ca60: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
ca70: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
ca80: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
ca90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
caa0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
cab0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
cac0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
cad0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
cae0: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
caf0: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
cb00: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
cb10: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
cb20: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
cb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cb40: 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70  EM_BKPT;.  memcp
cb50: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
cb60: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
cb70: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
cb80: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
cb90: 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
cba0: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
cbb0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cbc0: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
cbd0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cbe0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
cbf0: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
cc00: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
cc10: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
cc20: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
cc30: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
cc40: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
cc50: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
cc60: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
cc70: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
cc80: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
cc90: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
cca0: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
ccb0: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
ccc0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
ccd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cce0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
ccf0: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
cd00: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
cd10: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
cd20: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
cd30: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
cd40: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
cd50: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
cd60: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
cd70: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
cd80: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
cd90: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
cda0: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
cdb0: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
cdc0: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
cdd0: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
cde0: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
cdf0: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
ce00: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ce10: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
ce20: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
ce30: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
ce40: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
ce50: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
ce60: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
ce70: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
ce80: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
ce90: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
cea0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
ceb0: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
cec0: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
ced0: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
cee0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
cef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
cf00: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
cf10: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
cf20: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
cf30: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
cf40: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
cf50: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
cf60: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
cf70: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
cf80: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
cf90: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
cfa0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
cfb0: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
cfc0: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
cfd0: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
cfe0: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
cff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d000: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
d010: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
d020: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
d030: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
d040: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
d050: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
d060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d070: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d080: 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e  e runs at the en
d090: 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43  d of parsing a C
d0a0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d0b0: 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61  ement that.** ha
d0c0: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
d0d0: 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a  D clause.  The j
d0e0: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
d0f0: 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74  ne is to convert
d100: 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61   both.** interna
d110: 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74  l schema data st
d120: 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65  ructures and the
d130: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
d140: 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  code so that the
d150: 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72  y.** are appropr
d160: 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f  iate for a WITHO
d170: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69  UT ROWID table i
d180: 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69  nstead of a rowi
d190: 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e  d table..** Chan
d1a0: 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ges include:.**.
d1b0: 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76  **     (1)  Conv
d1c0: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
d1d0: 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f  eTable into an O
d1e0: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20  P_CreateIndex.  
d1f0: 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20  There is.**     
d200: 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74       no rowid bt
d210: 72 65 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ree for a WITHOU
d220: 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61  T ROWID.  Instea
d230: 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  d, the canonical
d240: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  .**          dat
d250: 61 20 73 74 6f 72 61 67 65 20 69 73 20 61 20 63  a storage is a c
d260: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74  overing index bt
d270: 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20  ree..**     (2) 
d280: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
d290: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
d2a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d2b0: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
d2c0: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
d2d0: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
d2e0: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
d2f0: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
d300: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
d310: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d320: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
d330: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
d340: 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 53  f..**     (3)  S
d350: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
d360: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
d370: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d380: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
d390: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
d3a0: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
d3b0: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
d3c0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
d3d0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
d3e0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d3f0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
d400: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
d410: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
d420: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
d430: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
d440: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
d450: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
d460: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
d470: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
d480: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
d490: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
d4a0: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
d4b0: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58  rt of KeyInfo.nX
d4c0: 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f  Field and are no
d4d0: 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  t used for.**   
d4e0: 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f         sorting o
d4f0: 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71  r lookup or uniq
d500: 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a  ueness checks..*
d510: 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61  *     (6)  Repla
d520: 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69  ce the rowid tai
d530: 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74  l on all automat
d540: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
d550: 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20   UNIQUE.**      
d560: 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68      indices with
d570: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d580: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
d590: 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74  tic void convert
d5a0: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
d5b0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d5c0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
d5d0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
d5e0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20    Index *pPk;.  
d5f0: 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69  int nPk;.  int i
d600: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
d610: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d620: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d630: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f  rse->pVdbe;..  /
d640: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50  * Convert the OP
d650: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63  _CreateTable opc
d660: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
d670: 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74  ormally create t
d680: 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67  he.  ** root-pag
d690: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
d6a0: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
d6b0: 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20 20  eIndex opcode.  
d6c0: 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  The index.  ** c
d6d0: 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63 6f  reated will beco
d6e0: 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  me the PRIMARY K
d6f0: 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  EY index..  */. 
d700: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
d710: 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73  rCrTab ){.    as
d720: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73  sert( v );.    s
d730: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d740: 4f 70 63 6f 64 65 28 76 2c 20 70 50 61 72 73 65  Opcode(v, pParse
d750: 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 4f 50 5f  ->addrCrTab, OP_
d760: 43 72 65 61 74 65 49 6e 64 65 78 29 3b 0a 20 20  CreateIndex);.  
d770: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
d780: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d790: 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68  ndex.  Or, if th
d7a0: 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69  is table was ori
d7b0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20  ginally.  ** an 
d7c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
d7d0: 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74  KEY table, creat
d7e0: 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20  e a new PRIMARY 
d7f0: 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f  KEY index. .  */
d800: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
d810: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  ey>=0 ){.    Exp
d820: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
d830: 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e    Token ipkToken
d840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
d850: 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e  enInit(&ipkToken
d860: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  , pTab->aCol[pTa
d870: 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
d880: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
d890: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d8a0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a  end(pParse, 0, .
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
d8d0: 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69  oc(db, TK_ID, &i
d8e0: 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  pkToken, 0));.  
d8f0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d900: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69   return;.    pLi
d910: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
d920: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
d930: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
d940: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
d950: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
d960: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
d970: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
d980: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
d990: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
d9a0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
d9b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d  );.    if( pPk==
d9c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
d9d0: 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20 53  pPk->idxType = S
d9e0: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
d9f0: 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70 54  IMARYKEY;.    pT
da00: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
da10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
da20: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
da30: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
da40: 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61 73 73 20  ..    /* Bypass 
da50: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
da60: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
da70: 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71  btree and the sq
da80: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20  lite_master.    
da90: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
daa0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
dab0: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
dac0: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
dad0: 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 66  BE.    ** code f
dae0: 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  or a CREATE TABL
daf0: 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73  E (not when pars
db00: 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20  ing one as part 
db10: 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 20 20 2a  of reading.    *
db20: 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  * a database sch
db30: 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ema).  */.    if
db40: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( v ){.      ass
db50: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
db60: 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  sy==0 );.      s
db70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
db80: 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74  Opcode(v, pPk->t
db90: 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  num, OP_Goto);. 
dba0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
dbb0: 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72   ** Remove all r
dbc0: 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
dbd0: 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52   from the PRIMAR
dbe0: 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d  Y KEY.  For exam
dbf0: 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20  ple, change.    
dc00: 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  ** "PRIMARY KEY(
dc10: 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29  a,b,a,b,c,b,c,d)
dc20: 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49  " into just "PRI
dc30: 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64  MARY KEY(a,b,c,d
dc40: 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a  )".  Later.    *
dc50: 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  * code assumes t
dc60: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
dc70: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61  ontains no repea
dc80: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ted columns..   
dc90: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d   */.    for(i=j=
dca0: 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  1; i<pPk->nKeyCo
dcb0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
dcc0: 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  f( hasColumn(pPk
dcd0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70  ->aiColumn, j, p
dce0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
dcf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   ){.        pPk-
dd00: 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20  >nColumn--;.    
dd10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dd20: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
dd30: 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  ++] = pPk->aiCol
dd40: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  umn[i];.      }.
dd50: 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e      }.    pPk->n
dd60: 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a  KeyCol = j;.  }.
dd70: 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e    pPk->isCoverin
dd80: 67 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  g = 1;.  assert(
dd90: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b   pPk!=0 );.  nPk
dda0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
ddb0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ddc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
ddd0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
dde0: 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 28   is NOT NULL.  (
ddf0: 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20 64 6f 20  Except,.  ** do 
de00: 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 69 73  not enforce this
de10: 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
de20: 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69 66 28 20  bles.) */.  if( 
de30: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
de40: 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  erTable ){.    f
de50: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
de60: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  ++){.      pTab-
de70: 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c  >aCol[pPk->aiCol
de80: 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20  umn[i]].notNull 
de90: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
dea0: 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e 69 71 4e  }.    pPk->uniqN
deb0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a  otNull = 1;.  }.
dec0: 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70  .  /* The root p
ded0: 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41  age of the PRIMA
dee0: 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61  RY KEY is the ta
def0: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  ble root page */
df00: 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70  .  pPk->tnum = p
df10: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a  Tab->tnum;..  /*
df20: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
df30: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
df40: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51  tion of all UNIQ
df50: 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f  UE indices by co
df60: 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68  nverting.  ** th
df70: 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f  e final rowid co
df80: 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72  lumn into one or
df90: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
dfa0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
dfb0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
dfc0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
dfd0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
dfe0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
dff0: 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72   n;.    if( IsPr
e000: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
e010: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
e020: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69      for(i=n=0; i
e030: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e040: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e050: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
e060: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
e070: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e080: 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) n++;.    }. 
e090: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
e0a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
e0b0: 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ex is a superset
e0c0: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
e0d0: 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64  key */.      pId
e0e0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64  x->nColumn = pId
e0f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
e100: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
e110: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
e120: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
e130: 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
e140: 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
e150: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e160: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
e170: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e180: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e190: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
e1a0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
e1b0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e1c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  ) ){.        pId
e1d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  x->aiColumn[j] =
e1e0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e1f0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ];.        pIdx-
e200: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
e210: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
e220: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
e230: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
e240: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e250: 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n>=pIdx->nKeyCol
e260: 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +n );.    assert
e270: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
e280: 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =j );.  }..  /* 
e290: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
e2a0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
e2b0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
e2c0: 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54   */.  if( nPk<pT
e2d0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
e2e0: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
e2f0: 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70  bject(db, pPk, p
e300: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74  Tab->nCol) ) ret
e310: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
e320: 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d  , j=nPk; i<pTab-
e330: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
e340: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
e350: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
e360: 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20   j, i) ){.      
e370: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d    assert( j<pPk-
e380: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
e390: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e3a0: 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[j] = i;.      
e3b0: 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d    pPk->azColl[j]
e3c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
e3d0: 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  ARY;.        j++
e3e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
e400: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20  >nColumn==j );. 
e410: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
e420: 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65  >nCol==j );.  }e
e430: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43  lse{.    pPk->nC
e440: 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43  olumn = pTab->nC
e450: 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol;.  }.}../*.**
e460: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
e470: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
e480: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
e490: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
e4a0: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
e4b0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
e4c0: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
e4d0: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
e4e0: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
e4f0: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
e500: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
e510: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
e520: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
e530: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
e540: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
e550: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
e560: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
e570: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
e580: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
e590: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
e5a0: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
e5b0: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
e5c0: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
e5d0: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
e5e0: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
e5f0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
e600: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e610: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
e620: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
e630: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
e640: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
e650: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e660: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
e670: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
e680: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
e690: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
e6a0: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
e6b0: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
e6c0: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
e6d0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
e6e0: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
e6f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
e700: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
e710: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
e720: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
e730: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
e740: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
e750: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
e760: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
e770: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
e780: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
e790: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
e7a0: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
e7b0: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
e7c0: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
e7d0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
e7e0: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
e7f0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
e800: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e810: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
e820: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
e830: 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
e840: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
e850: 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
e860: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
e870: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
e880: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
e890: 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72  /* The ')' befor
e8a0: 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65  e options in the
e8b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
e8c0: 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20  .  u8 tabOpts,  
e8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
e8e0: 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e  tra table option
e8f0: 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f  s. Usually 0. */
e900: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e910: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
e920: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
e930: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
e940: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
e950: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e960: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
e970: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
e980: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e990: 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
e9a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e9b0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e9d0: 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
e9e0: 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69  ich the table li
e9f0: 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ves */.  Index *
ea00: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
ea10: 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64     /* An implied
ea20: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
ea30: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45  ble */..  if( pE
ea40: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
ea50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ea60: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
ea70: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ea80: 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  ed );.  p = pPar
ea90: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
eaa0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
eab0: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
eac0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
ead0: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
eae0: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
eaf0: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
eb00: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
eb10: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
eb20: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
eb30: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
eb40: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
eb50: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
eb60: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
eb70: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
eb80: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
eb90: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
eba0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
ebb0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
ebc0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
ebd0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
ebe0: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
ebf0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
ec00: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
ec10: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
ec20: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
ec30: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
ec40: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
ec50: 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
ec60: 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
ec70: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
ec80: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
ec90: 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
eca0: 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
ecb0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
ecc0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
ecd0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
ece0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75  ;.    if( p->tnu
ecf0: 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61  m==1 ) p->tabFla
ed00: 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c  gs |= TF_Readonl
ed10: 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  y;.  }..  /* Spe
ed20: 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
ed30: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
ed40: 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
ed50: 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
ed60: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
ed70: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
ed80: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
ed90: 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
eda0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
edb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
edc0: 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
edd0: 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
ede0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
edf0: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
ee00: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
ee10: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
ee20: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
ee30: 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
ee40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ee50: 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
ee60: 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
ee70: 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
ee80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
ee90: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46  e{.      p->tabF
eea0: 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f  lags |= TF_Witho
eeb0: 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
eec0: 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
eed0: 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68     convertToWith
eee0: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50  outRowidTable(pP
eef0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
ef00: 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c    }..  iDb = sql
ef10: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
ef20: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
ef30: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
ef40: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
ef50: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
ef60: 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
ef70: 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
ef80: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
ef90: 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
efa0: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
efb0: 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
efc0: 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68  arse, p, NC_IsCh
efd0: 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63  eck, 0, p->pChec
efe0: 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  k);.  }.#endif /
eff0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f000: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
f010: 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
f020: 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20  the average row 
f030: 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62  size for the tab
f040: 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
f050: 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a  mplied indices *
f060: 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c  /.  estimateTabl
f070: 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72  eWidth(p);.  for
f080: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
f090: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f0a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73  ->pNext){.    es
f0b0: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
f0c0: 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
f0d0: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
f0e0: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
f0f0: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
f100: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
f110: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
f120: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
f130: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
f140: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
f150: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
f160: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
f170: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
f180: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
f190: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
f1a0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
f1b0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
f1c0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
f1d0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
f1e0: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
f1f0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
f200: 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
f210: 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
f220: 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
f230: 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
f240: 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
f250: 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
f260: 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
f270: 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
f280: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
f290: 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
f2a0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f2b0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
f2c0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
f2d0: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
f2e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f2f0: 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20  _Close, 0);..   
f300: 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74   /* .    ** Init
f310: 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72  ialize zType for
f320: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72   the new view or
f330: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
f340: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
f350: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
f360: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
f370: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
f380: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
f390: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
f3a0: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
f3b0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
f3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f3d0: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
f3e0: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
f3f0: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
f400: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
f410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
f420: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
f430: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
f440: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
f450: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
f460: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
f470: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
f480: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
f490: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
f4a0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
f4b0: 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73  able is in regis
f4c0: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
f4d0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oot..    **.    
f4e0: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
f4f0: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
f500: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
f510: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
f520: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
f530: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
f540: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
f550: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
f560: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
f570: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
f580: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f590: 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
f5a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
f5b0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
f5c0: 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
f5d0: 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
f5e0: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
f5f0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
f600: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
f610: 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
f620: 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
f630: 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
f640: 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
f650: 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
f660: 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
f670: 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
f680: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
f690: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
f6a0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
f6b0: 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  est;    /* Where
f6c0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75   the SELECT shou
f6d0: 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73  ld store results
f6e0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
f6f0: 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  gYield;       /*
f700: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
f710: 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74  g co-routine ent
f720: 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ry-point */.    
f730: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
f740: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
f750: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  the co-routine *
f760: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
f770: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ec;         /* A
f780: 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
f790: 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  sert into the ne
f7a0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  w table */.     
f7b0: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
f7c0: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
f7d0: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f   the next row to
f7e0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20   insert */.     
f7f0: 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70   int addrInsLoop
f800: 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  ;    /* Top of t
f810: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65  he loop for inse
f820: 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rting rows */.  
f830: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
f840: 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62  ab;     /* A tab
f850: 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  le that describe
f860: 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  s the SELECT res
f870: 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ults */..      r
f880: 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72  egYield = ++pPar
f890: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
f8a0: 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73  regRec = ++pPars
f8b0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
f8c0: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
f8d0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
f8e0: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
f8f0: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
f900: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
f910: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
f920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f930: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
f940: 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
f950: 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
f960: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f970: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
f980: 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
f990: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
f9a0: 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
f9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f9c0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
f9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
f9f0: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
fa00: 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f  Yield, 0, addrTo
fa10: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
fa20: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
fa30: 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
fa40: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
fa50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fa60: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
fa70: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
fa80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
fa90: 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
faa0: 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  egYield);.      
fab0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fac0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d  ere(v, addrTop -
fad0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
fae0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
faf0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c  turn;.      pSel
fb00: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
fb10: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
fb20: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
fb30: 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54  .      if( pSelT
fb40: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
fb50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fb60: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
fb70: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
fb80: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
fb90: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
fba0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
fbb0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
fbc0: 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
fbd0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
fbe0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
fbf0: 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
fc00: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73  );.      addrIns
fc10: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
fc20: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
fc30: 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
fc40: 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rm);.      VdbeC
fc50: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc70: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
fc80: 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74  cord, dest.iSdst
fc90: 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65  , dest.nSdst, re
fca0: 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  gRec);.      sql
fcb0: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
fcc0: 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  y(v, p, 0);.    
fcd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fce0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
fcf0: 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  id, 1, regRowid)
fd00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fd10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fd20: 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65  Insert, 1, regRe
fd30: 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
fd40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
fd50: 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  oto(v, addrInsLo
fd60: 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
fd70: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fd80: 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
fd90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fda0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
fdb0: 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a  ose, 1);.    }..
fdc0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
fdd0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
fde0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
fdf0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
fe00: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
fe10: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
fe20: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
fe30: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
fe40: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
fe50: 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
fe60: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
fe70: 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
fe80: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
fe90: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
fea0: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
feb0: 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
fec0: 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
fed0: 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
fee0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
fef0: 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
ff00: 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
ff10: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
ff20: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
ff30: 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
ff40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
ff50: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
ff60: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
ff70: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
ff80: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
ff90: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
ffa0: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
ffb0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
ffc0: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
ffd0: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
ffe0: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
fff0: 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
10000 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10010 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
10020 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
10030 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
10040 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
10050 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
10060 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
10070 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
10080 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
10090 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
100a0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
100b0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
100c0 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
100d0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
100e0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
100f0 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
10100 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
10110 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
10120 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
10130 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10140 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
10150 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10160 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10170 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10180 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
10190 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
101a0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
101b0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
101c0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
101d0 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
101e0 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
101f0 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
10200 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
10210 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
10220 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
10230 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
10240 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10250 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
10260 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10270 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
10280 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
10290 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
102a0 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
102b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
102c0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
102d0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
102e0 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
102f0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
10300 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
10310 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
10320 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
10330 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
10340 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
10350 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
10360 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
10370 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
10380 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
10390 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
103a0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
103b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
103c0 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
103d0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
103e0 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
103f0 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
10400 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
10410 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
10420 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
10430 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
10440 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
10450 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
10460 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
10470 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
10480 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
10490 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
104a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
104b0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
104c0 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
104d0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
104e0 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
104f0 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
10500 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
10510 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
10520 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
10530 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
10540 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
10550 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
10560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
10570 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
10580 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
10590 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
105a0 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
105b0 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
105c0 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
105d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
105e0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
105f0 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
10600 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
10610 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
10620 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
10630 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
10640 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
10650 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
10660 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
10670 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
10680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
10690 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
106a0 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
106b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
106c0 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
106d0 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
106e0 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
106f0 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
10700 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
10710 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
10720 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
10730 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
10740 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10750 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10760 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
10770 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
10780 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
10790 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
107a0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
107b0 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
107c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
107d0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
107e0 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
107f0 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
10800 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
10810 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
10820 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
10830 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
10840 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
10850 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
10860 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
10870 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10880 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
10890 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
108a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
108b0 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  iew */.  ExprLis
108c0 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f  t *pCNames, /* O
108d0 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20  ptional list of 
108e0 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  view column name
108f0 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
10900 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
10910 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10920 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
10930 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
10940 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
10950 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
10960 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
10970 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  ew */.  int noEr
10980 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  r          /* Su
10990 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73  ppress error mes
109a0 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c  sages if VIEW al
109b0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
109c0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
109d0 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
109e0 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e  char *z;.  Token
109f0 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72   sEnd;.  DbFixer
10a00 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a   sFix;.  Token *
10a10 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pName = 0;.  int
10a20 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
10a30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10a40 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
10a50 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
10a60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10a70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
10a80 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
10a90 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
10aa0 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76     goto create_v
10ab0 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20  iew_fail;.  }.  
10ac0 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
10ad0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10ae0 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
10af0 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
10b00 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
10b10 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
10b20 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
10b30 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74  Err ) goto creat
10b40 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73  e_view_fail;.  s
10b50 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
10b60 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10b70 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
10b80 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
10b90 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
10ba0 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
10bb0 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
10bc0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
10bd0 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
10be0 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
10bf0 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
10c00 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67  ix, pSelect) ) g
10c10 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
10c20 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  fail;..  /* Make
10c30 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
10c40 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
10c50 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
10c60 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
10c70 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
10c80 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
10c90 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
10ca0 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
10cb0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
10cc0 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
10cd0 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
10ce0 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
10cf0 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
10d00 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
10d10 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
10d20 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
10d30 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
10d40 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
10d50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10d60 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
10d70 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
10d80 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20  ;.  p->pCheck = 
10d90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
10da0 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20  up(db, pCNames, 
10db0 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
10dc0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
10dd0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63  cFailed ) goto c
10de0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
10df0 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
10e00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
10e10 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
10e20 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
10e30 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
10e40 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
10e50 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
10e60 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  tToken;.  assert
10e70 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29  ( sEnd.z[0]!=0 )
10e80 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
10e90 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
10ea0 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
10eb0 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
10ec0 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
10ed0 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
10ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  );.  assert( n>0
10ef0 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e   );.  z = pBegin
10f00 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  ->z;.  while( sq
10f10 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e  lite3Isspace(z[n
10f20 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  -1]) ){ n--; }. 
10f30 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
10f40 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
10f50 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
10f60 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
10f70 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
10f80 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10f90 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
10fa0 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
10fb0 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
10fc0 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69  , 0);..create_vi
10fd0 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74  ew_fail:.  sqlit
10fe0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
10ff0 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  b, pSelect);.  s
11000 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11010 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73  lete(db, pCNames
11020 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
11030 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11040 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
11050 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
11060 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
11070 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11080 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11090 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
110a0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
110b0 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
110c0 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
110d0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
110e0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
110f0 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
11100 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
11110 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
11120 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
11130 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
11140 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
11150 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
11160 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
11170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11180 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
11190 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
111a0 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
111b0 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
111c0 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
111d0 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
111e0 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
111f0 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
11200 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
11210 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
11220 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
11230 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
11240 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
11250 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11260 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
11270 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
11280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11290 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
112a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
112b0 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
112c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
112d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
112e0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
112f0 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
11300 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69  errors */.  sqli
11310 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
11320 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
11330 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f  xAuth pointer */
11340 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
11350 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
11360 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11370 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
11380 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
11390 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
113a0 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
113b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
113c0 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
113d0 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
113e0 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
113f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11400 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
11410 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
11420 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
11430 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
11440 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
11450 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
11460 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
11470 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
11480 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
11490 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
114a0 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
114b0 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
114c0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
114d0 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
114e0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
114f0 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
11500 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
11510 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
11520 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
11530 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
11540 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
11550 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
11560 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11570 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
11580 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
11590 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
115a0 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
115b0 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
115c0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
115d0 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
115e0 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
115f0 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
11600 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
11610 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
11620 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
11630 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
11640 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
11650 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
11660 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
11670 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
11680 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
11690 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
116a0 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
116b0 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
116c0 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
116d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
116e0 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
116f0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
11700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11710 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11720 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
11730 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
11740 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
11750 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11760 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
11770 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
11780 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
11790 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
117a0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
117b0 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
117c0 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
117d0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
117e0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
117f0 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
11800 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
11810 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
11820 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
11830 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
11840 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
11850 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
11860 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
11870 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
11880 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
11890 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
118a0 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
118b0 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
118c0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
118d0 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
118e0 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
118f0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11900 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11910 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11920 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
11930 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
11940 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
11950 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
11960 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
11970 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  ){.    n = pPars
11980 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
11990 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
119a0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
119b0 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
119c0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
119d0 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
119e0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
119f0 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
11a00 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
11a10 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
11a20 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
11a30 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
11a40 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
11a50 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11a60 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11a70 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
11a80 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
11a90 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
11aa0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
11ab0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
11ac0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
11ad0 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
11ae0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
11af0 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
11b00 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
11b10 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
11b20 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
11b30 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
11b40 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
11b50 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
11b60 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
11b70 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
11b80 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
11b90 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
11ba0 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
11bb0 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
11bc0 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
11bd0 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
11be0 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
11bf0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
11c00 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
11c10 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
11c20 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
11c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
11c40 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
11c50 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11c60 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
11c90 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
11ca0 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
11cb0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11cc0 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
11cd0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
11ce0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
11cf0 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
11d00 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
11d10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
11d20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
11d30 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
11d40 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
11d50 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
11d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
11d70 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
11d80 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
11d90 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
11da0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
11db0 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
11dc0 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
11dd0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
11de0 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
11df0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
11e00 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
11e10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11e20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11e30 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
11e40 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
11e50 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
11e60 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
11e70 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
11e80 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
11e90 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
11ea0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
11eb0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
11ec0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
11ed0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
11ee0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
11ef0 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
11f00 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
11f10 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
11f20 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
11f30 69 66 28 20 70 53 65 6c 54 61 62 20 29 20 73 71  if( pSelTab ) sq
11f40 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
11f50 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
11f60 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
11f70 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29  Delete(db, pSel)
11f80 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
11f90 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a  ide.bDisable--;.
11fa0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
11fb0 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61  Err++;.  }.  pTa
11fc0 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  ble->pSchema->sc
11fd0 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f  hemaFlags |= DB_
11fe0 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65  UnresetViews;.#e
11ff0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12000 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
12010 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
12020 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
12030 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12040 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
12050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12060 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
12070 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12080 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
12090 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
120a0 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
120b0 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
120c0 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
120d0 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
120e0 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
120f0 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
12100 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61  HashElem *i;.  a
12110 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
12120 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12130 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69  , idx, 0) );.  i
12140 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
12150 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
12160 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
12170 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
12180 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
12190 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
121a0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
121b0 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
121c0 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
121d0 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
121e0 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
121f0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
12200 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
12210 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
12220 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  mes(db, pTab);. 
12230 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20       pTab->aCol 
12240 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 0;.      pTab-
12250 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  >nCol = 0;.    }
12260 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
12270 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
12280 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
12290 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
122a0 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
122b0 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
122c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
122d0 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
122e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
122f0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
12300 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
12310 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
12320 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
12330 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
12340 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
12350 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
12360 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
12370 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
12380 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
12390 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
123a0 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
123b0 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54   to iTo..**.** T
123c0 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68  icket #1728:  Th
123d0 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d  e symbol table m
123e0 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ight still conta
123f0 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  in information.*
12400 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f  * on tables and/
12410 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  or indices that 
12420 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  are the process 
12430 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  of being deleted
12440 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20  ..** If you are 
12450 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20  unlucky, one of 
12460 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e  those deleted in
12470 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20  dices or tables 
12480 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68  might.** have th
12490 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20  e same rootpage 
124a0 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65  number as the re
124b0 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  al table or inde
124c0 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69  x that is.** bei
124d0 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65  ng moved.  So we
124e0 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61   cannot stop sea
124f0 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65  rching after the
12500 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a   first match .**
12510 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72   because the fir
12520 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62  st match might b
12530 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
12540 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
12550 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e  .** or tables an
12560 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f  d not the table/
12570 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63  index that is ac
12580 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76  tually being mov
12590 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63  ed..** We must c
125a0 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20  ontinue looping 
125b0 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73  until all tables
125c0 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74   and indices wit
125d0 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69  h.** rootpage==i
125e0 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63  From have been c
125f0 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65  onverted to have
12600 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69   a rootpage of i
12610 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  To.** in order t
12620 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61  o be certain tha
12630 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67  t we got the rig
12640 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ht one..*/.#ifnd
12650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12660 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
12670 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
12680 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ved(sqlite3 *db,
12690 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46   int iDb, int iF
126a0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
126b0 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d   HashElem *pElem
126c0 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
126d0 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
126e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
126f0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12700 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70  , iDb, 0) );.  p
12710 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
12720 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70  b];.  pHash = &p
12730 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
12740 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
12750 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
12760 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
12770 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
12780 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
12790 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
127a0 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
127b0 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
127c0 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
127d0 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
127e0 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
127f0 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
12800 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
12810 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
12820 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
12830 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
12840 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
12850 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
12860 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
12870 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
12880 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
12890 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
128a0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
128b0 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
128c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
128d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
128e0 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
128f0 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
12900 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
12910 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
12920 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
12930 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
12940 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
12950 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
12960 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
12970 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
12980 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
12990 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
129a0 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
129b0 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
129c0 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
129d0 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
129e0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
129f0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
12a00 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
12a10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12a20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
12a30 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
12a40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12a50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
12a60 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
12a70 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
12a80 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 62 6c  .  assert( iTabl
12a90 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  e>1 );.  sqlite3
12aa0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12ab0 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65  _Destroy, iTable
12ac0 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71  , r1, iDb);.  sq
12ad0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
12ae0 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
12af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12b00 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
12b10 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20  stroy stores an 
12b20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49  in integer r1. I
12b30 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
12b40 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
12b50 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
12b60 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
12b70 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
12b80 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
12b90 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
12ba0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
12bb0 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
12bc0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
12bd0 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
12be0 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
12bf0 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65  he "#NNN" in the
12c00 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
12c10 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
12c20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
12c30 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20  alue.  ** is in 
12c40 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53  register NNN.  S
12c50 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73  ee grammar rules
12c60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12c70 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52   the TK_REGISTER
12c80 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20  .  ** token for 
12c90 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12ca0 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73  mation..  */.  s
12cb0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12cc0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
12cd0 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
12ce0 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
12cf0 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
12d00 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
12d10 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
12d20 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
12d30 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
12d40 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
12d50 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
12d60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
12d70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
12d80 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
12d90 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
12da0 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
12db0 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
12dc0 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
12dd0 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
12de0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
12df0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
12e00 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
12e10 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
12e20 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
12e30 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
12e40 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
12e50 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
12e60 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
12e70 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
12e80 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
12e90 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
12ea0 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
12eb0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
12ec0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
12ed0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
12ee0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12ef0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12f00 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
12f10 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
12f20 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
12f30 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
12f40 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
12f50 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
12f60 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
12f70 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
12f80 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
12f90 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
12fa0 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
12fb0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
12fc0 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
12fd0 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
12fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
12ff0 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
13000 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
13010 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
13020 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
13030 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
13040 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
13050 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
13060 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
13070 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
13080 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
13090 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
130a0 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
130b0 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
130c0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
130d0 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
130e0 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
130f0 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
13100 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
13110 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
13120 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
13130 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
13140 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
13150 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
13160 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
13170 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
13180 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
13190 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
131a0 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
131b0 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
131c0 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
131d0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
131e0 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
131f0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
13200 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
13210 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
13220 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
13230 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
13240 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
13250 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
13260 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
13270 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
13280 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
13290 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
132a0 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
132b0 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
132c0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
132d0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
132e0 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
132f0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
13300 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
13310 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
13320 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
13330 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
13340 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
13350 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
13360 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
13370 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
13380 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
13390 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
133a0 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
133b0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
133c0 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
133d0 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
133e0 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
133f0 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
13400 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
13410 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
13420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13430 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
13440 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
13450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
13460 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13470 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
13480 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
13490 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
134a0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
134b0 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
134c0 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
134d0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
134e0 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
134f0 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
13500 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
13510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13520 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
13530 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13540 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
13550 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
13560 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
13570 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
13580 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
13590 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
135a0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
135b0 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
135c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
135d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
135e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
135f0 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
13600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13610 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
13620 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
13630 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
13640 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
13650 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13660 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
13670 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
13680 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
13690 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
136a0 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
136b0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
136c0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69  ].zName;.  for(i
136d0 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a  =1; i<=4; i++){.
136e0 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34      char zTab[24
136f0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
13700 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
13710 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74  Tab),zTab,"sqlit
13720 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20  e_stat%d",i);.  
13730 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
13740 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
13750 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65  b, zTab, zDbName
13760 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
13770 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
13780 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
13790 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
137a0 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20   WHERE %s=%Q",. 
137b0 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20         zDbName, 
137c0 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61  zTab, zType, zNa
137d0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
137e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
137f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13800 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  drop a table..*/
13810 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
13820 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
13830 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
13840 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20  *pTab, int iDb, 
13850 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56  int isView){.  V
13860 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
13870 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13880 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  db;.  Trigger *p
13890 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70  Trigger;.  Db *p
138a0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
138b0 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  b];..  v = sqlit
138c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
138d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
138e0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  0 );.  sqlite3Be
138f0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
13900 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
13910 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
13920 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13930 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
13940 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
13950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13960 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
13970 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13980 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
13990 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
139a0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
139b0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
139c0 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65  ode.  ** is gene
139d0 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
139e0 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
139f0 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
13a00 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65  r.  ** sqlite_te
13a10 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
13a20 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
13a30 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
13a40 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
13a50 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69  se, pTab);.  whi
13a60 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
13a70 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
13a80 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
13a90 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
13aa0 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
13ab0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
13ac0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
13ad0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f  ;.    sqlite3Dro
13ae0 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
13af0 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
13b00 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
13b10 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
13b20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13b30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
13b40 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
13b50 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
13b60 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
13b70 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
13b80 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  iated with.  ** 
13b90 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
13ba0 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
13bb0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
13bc0 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
13bd0 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74  d.  ** at the bt
13be0 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
13bf0 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
13c00 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
13c10 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20  ds to.  ** move 
13c20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
13c30 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
13c40 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
13c50 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20  um mode)..  */. 
13c60 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
13c70 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
13c80 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  rement ){.    sq
13c90 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13ca0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
13cb0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
13cc0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
13cd0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
13ce0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
13cf0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
13d00 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
13d10 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51    /* Drop all SQ
13d20 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
13d30 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  e and index entr
13d40 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ies that refer t
13d50 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  o the.  ** table
13d60 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
13d70 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
13d80 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13d90 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
13da0 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
13db0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
13dc0 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
13dd0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
13de0 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70  being.  ** dropp
13df0 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
13e00 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
13e10 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
13e20 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a  igger can be.  *
13e30 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
13e40 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
13e50 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
13e60 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
13e70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  .  ** database..
13e80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
13e90 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
13ea0 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  , .      "DELETE
13eb0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
13ec0 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e  E tbl_name=%Q an
13ed0 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  d type!='trigger
13ee0 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  '",.      pDb->z
13ef0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
13f00 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
13f10 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73  Name);.  if( !is
13f20 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
13f30 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13f40 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
13f50 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  rse, pTab);.  }.
13f60 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
13f70 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
13f80 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
13f90 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
13fa0 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
13fb0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
13fc0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
13fd0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13fe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ff0 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
14000 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14010 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14020 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14030 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
14040 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
14050 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
14060 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e  );.  sqlite3Chan
14070 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
14080 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56   iDb);.  sqliteV
14090 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
140a0 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
140b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
140c0 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
140d0 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
140e0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
140f0 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
14100 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
14110 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
14120 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14130 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
14140 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
14150 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
14160 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
14170 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
14180 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
14190 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
141a0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
141b0 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
141c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
141d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
141e0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
141f0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14200 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
14210 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
14220 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
14230 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
14240 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
14250 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66  drop_table;.  if
14260 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
14270 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70  ppressErr++;.  p
14280 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
14290 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
142a0 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e  rse, isView, &pN
142b0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66  ame->a[0]);.  if
142c0 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
142d0 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20  ppressErr--;..  
142e0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
142f0 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73     if( noErr ) s
14300 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14310 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
14320 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
14330 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
14340 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14350 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
14360 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
14370 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
14380 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
14390 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
143a0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
143b0 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
143c0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
143d0 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
143e0 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
143f0 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
14400 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
14410 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14420 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
14430 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
14440 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
14450 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
14460 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14470 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14480 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
14490 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
144a0 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
144b0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
144c0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
144d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
144e0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
144f0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
14500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
14510 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
14520 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14530 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14540 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
14550 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
14560 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14580 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
14590 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
145a0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
145b0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
145c0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
145d0 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
145e0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
145f0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
14600 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
14610 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
14620 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
14630 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
14640 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14650 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14660 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
14670 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
14680 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
14690 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
146a0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
146b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
146c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
146d0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
146e0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
146f0 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
14700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14710 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
14720 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
14730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14740 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14750 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
14760 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
14770 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
14780 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14790 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
147a0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
147b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
147c0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
147d0 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
147e0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
147f0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14800 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
14810 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
14820 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
14830 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
14840 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
14850 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
14860 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
14870 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
14880 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
14890 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
148a0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
148b0 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
148c0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
148d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
148e0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
148f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14900 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
14910 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
14920 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
14930 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
14940 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
14950 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
14960 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
14970 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
14980 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
14990 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
149a0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
149b0 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
149c0 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
149d0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
149e0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
149f0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
14a00 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
14a10 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
14a20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14a30 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
14a40 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
14a50 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
14a60 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
14a70 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14a80 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
14a90 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14aa0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
14ab0 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
14ac0 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
14ad0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
14ae0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14af0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14b00 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
14b10 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
14b20 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
14b30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
14b40 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
14b50 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
14b60 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
14b70 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
14b80 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
14b90 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
14ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
14bb0 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  eDropTable(pPars
14bc0 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73  e, pTab, iDb, is
14bd0 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  View);.  }..exit
14be0 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
14bf0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
14c00 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
14c10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14c20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14c30 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
14c40 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
14c50 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
14c60 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
14c70 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
14c80 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
14c90 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
14ca0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
14cb0 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
14cc0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
14cd0 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
14ce0 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
14cf0 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
14d00 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
14d10 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
14d20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
14d30 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
14d40 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72   (a.k.a the "par
14d50 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54  ent" table).  pT
14d60 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a  oCol is a list.*
14d70 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  * of tables in t
14d80 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61  he parent pTo ta
14d90 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74  ble.  flags cont
14da0 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
14db0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
14dc0 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
14dd0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
14de0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
14df0 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
14e00 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
14e10 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
14e20 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
14e30 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
14e40 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
14e50 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
14e60 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
14e70 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
14e80 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
14e90 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
14ea0 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
14eb0 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
14ec0 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
14ed0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
14ee0 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
14ef0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
14f00 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
14f10 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
14f20 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
14f30 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
14f40 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
14f50 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
14f60 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14f70 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
14f80 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
14f90 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
14fa0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
14fb0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
14fc0 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
14fd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
14fe0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
14ff0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15000 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
15010 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
15020 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
15030 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
15040 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
15050 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
15060 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
15070 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15080 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
15090 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
150a0 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
150b0 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
150c0 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
150d0 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
150e0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
150f0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
15100 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
15110 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
15120 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
15130 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
15140 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
15150 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
15160 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
15170 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
15180 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
15190 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
151a0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
151b0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
151c0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
151d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
151e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
151f0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
15200 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
15210 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
15220 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
15230 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
15240 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
15250 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
15260 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
15270 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
15280 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
15290 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
152a0 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
152b0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
152c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
152d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
152e0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
152f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
15300 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
15310 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
15320 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
15330 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
15340 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
15350 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
15360 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
15370 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
15380 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
15390 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
153a0 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
153b0 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
153c0 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
153d0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
153e0 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
153f0 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
15400 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
15410 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
15420 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
15430 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
15440 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
15450 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
15460 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
15470 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
15480 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
15490 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
154a0 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
154b0 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
154c0 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
154d0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
154e0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
154f0 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
15500 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
15510 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
15520 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
15530 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
15540 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
15550 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
15560 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
15570 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
15580 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
15590 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
155a0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
155b0 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
155c0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
155d0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
155e0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
155f0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
15600 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15610 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
15620 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
15630 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
15640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
15650 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
15660 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
15670 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15680 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15690 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
156a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
156b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
156c0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
156d0 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
156e0 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
156f0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
15700 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
15710 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
15720 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
15730 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
15740 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15750 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
15760 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
15770 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
15780 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15790 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
157a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
157b0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
157c0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
157d0 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
157e0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
157f0 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
15800 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
15810 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
15820 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
15830 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
15840 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
15850 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
15860 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
15870 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
15880 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
15890 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
158a0 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
158b0 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
158c0 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
158d0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
158e0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
158f0 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
15900 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
15910 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
15920 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
15930 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
15940 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
15950 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a  , (void *)pFKey.
15960 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74    );.  if( pNext
15970 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20  To==pFKey ){.   
15980 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
15990 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  (db);.    goto f
159a0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
159b0 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
159c0 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
159d0 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
159e0 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
159f0 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
15a00 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
15a10 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
15a20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
15a30 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
15a40 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
15a50 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
15a60 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
15a70 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
15a80 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
15a90 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
15aa0 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
15ab0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15ac0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
15ad0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
15ae0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
15af0 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
15b00 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15b10 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
15b20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15b30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
15b40 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
15b50 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
15b60 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15b70 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
15b80 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
15b90 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
15ba0 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
15bb0 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
15bc0 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
15bd0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15be0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
15bf0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
15c00 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
15c10 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
15c20 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
15c30 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
15c40 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
15c50 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
15c60 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
15c70 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
15c80 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
15c90 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
15ca0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
15cb0 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
15cc0 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
15cd0 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
15ce0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15cf0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
15d00 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
15d10 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
15d20 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
15d30 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
15d40 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
15d50 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
15d60 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
15d70 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
15d80 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
15d90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15da0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
15db0 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
15dc0 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
15dd0 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
15de0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
15df0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
15e00 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
15e10 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
15e20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
15e30 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
15e40 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
15e50 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
15e60 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
15e70 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
15e80 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
15e90 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
15ea0 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
15eb0 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
15ec0 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
15ed0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
15ee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15ef0 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
15f00 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
15f10 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
15f20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
15f30 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
15f40 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
15f50 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
15f60 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
15f70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15f80 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
15f90 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
15fa0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
15fb0 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
15fc0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
15fd0 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
15fe0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
15ff0 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
16000 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
16010 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
16020 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
16030 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
16040 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
16050 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
16060 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
16070 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
16080 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
16090 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
160a0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
160b0 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
160c0 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160e0 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
160f0 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
16100 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
16110 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16130 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
16140 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
16150 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
16160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16170 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
16180 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
16190 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
161a0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
161b0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
161c0 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
161d0 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
161e0 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
161f0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
16200 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
16210 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
16220 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
16230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
16240 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
16250 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
16260 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
16270 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
16280 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
16290 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
162a0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
162b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
162d0 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
162e0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
162f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
16300 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
16310 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
16320 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16330 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
16340 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
16350 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
16360 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
16370 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
16380 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
16390 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
163a0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
163b0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
163c0 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
163d0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
163e0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
163f0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
16400 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
16410 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16420 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
16430 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
16440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
16450 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
16460 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
16470 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
16480 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
16490 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
164a0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
164b0 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
164c0 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
164d0 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
164e0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
164f0 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
16500 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
16510 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
16520 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
16530 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  , pIndex);..  /*
16540 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16550 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
16560 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16570 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16580 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
165a0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
165b0 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
165c0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
165d0 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
165e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
165f0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
16600 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
16610 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
16620 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
16630 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16640 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16650 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
16660 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16670 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16680 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16690 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
166a0 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
166b0 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
166c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
166d0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
166e0 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
166f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16700 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
16710 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16720 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16730 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16740 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16750 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
16760 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16770 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16790 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
167a0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
167b0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
167c0 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
167d0 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
167e0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
167f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16800 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
16810 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16820 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16830 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16840 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16850 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
16860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16870 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16880 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16890 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
168a0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
168b0 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
168e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
168f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16900 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16910 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16920 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16930 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16940 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16950 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16960 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16970 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16980 65 72 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65  erage(v);.  asse
16990 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
169a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
169b0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
169c0 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
169d0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 26  eIndex(pIndex) &
169e0 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20  & pKey!=0 ){.   
169f0 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
16a00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16a10 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c  (v) + 3;.    sql
16a20 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
16a30 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  j2);.    addr2 =
16a40 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
16a50 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
16a60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
16a80 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
16a90 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
16aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16ab0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
16ac0 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
16ad0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16ae0 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
16af0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
16b00 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
16b10 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
16b20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
16b30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16b40 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
16b50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16b60 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
16b70 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
16b80 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
16b90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16ba0 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20   OP_Last, iIdx, 
16bb0 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  0, -1);.  sqlite
16bc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16bd0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
16be0 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29  x, regRecord, 0)
16bf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
16c00 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
16c10 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
16c20 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
16c30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16c40 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
16c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16c60 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
16c70 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
16c80 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
16c90 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
16ca0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
16cb0 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
16cc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16cd0 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
16ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16cf0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
16d00 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
16d10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16d20 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
16d30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
16d40 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
16d50 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
16d60 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
16d70 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
16d80 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
16d90 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
16da0 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
16db0 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
16dc0 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
16dd0 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
16de0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
16df0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
16e00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
16e10 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
16e20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
16e30 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
16e40 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
16e50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
16e60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
16e70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
16e80 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
16e90 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
16ea0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
16eb0 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
16ec0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
16ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16ee0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16ef0 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
16f00 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
16f10 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
16f20 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
16f30 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
16f40 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
16f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16f60 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
16f70 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
16f80 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
16f90 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
16fa0 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
16fb0 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
16fc0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
16fd0 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
16fe0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
16ff0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
17000 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
17010 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17020 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
17030 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
17040 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
17050 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
17060 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17070 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
17080 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
17090 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
170a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
170b0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
170c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
170d0 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
170e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
170f0 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
17100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17110 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
17120 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
17130 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
17140 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
17150 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
17160 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
17170 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
17180 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
17190 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
171a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45  (const char**)pE
171b0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
171c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
171d0 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
171e0 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
171f0 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
17200 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
17210 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
17220 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
17230 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
17240 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
17250 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
17260 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
17270 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
17280 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
17290 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
172a0 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
172b0 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
172c0 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
172d0 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
172e0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
172f0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
17300 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
17310 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
17320 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
17330 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17340 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
17350 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
17360 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
17370 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17380 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
17390 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
173a0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
173b0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
173c0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
173d0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
173e0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
173f0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
17400 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
17410 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17420 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
17430 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
17440 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
17450 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
17460 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
17470 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
17480 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
17490 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
174a0 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
174b0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
174c0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
174d0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
174e0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
174f0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
17500 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
17510 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
17520 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
17530 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
17540 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
17550 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
17560 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  tion.  .**.** If
17570 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72   the index is cr
17580 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  eated successful
17590 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ly, return a poi
175a0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
175b0 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75  Index.** structu
175c0 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  re. This is used
175d0 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72   by sqlite3AddPr
175e0 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61  imaryKey() to ma
175f0 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  rk the index.** 
17600 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72  as the tables pr
17610 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78  imary key (Index
17620 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45  .idxType==SQLITE
17630 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
17640 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  KEY).*/.Index *s
17650 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
17660 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
17670 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
17680 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17690 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
176a0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
176b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
176c0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
176d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
176e0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
176f0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
17700 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
17710 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
17720 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
17730 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
17740 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
17750 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
17760 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
17770 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
17780 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
17790 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
177a0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
177b0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
177c0 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
177d0 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
177e0 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
177f0 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
17800 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
17810 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
17820 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
17830 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72  .  Expr *pPIWher
17840 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63  e,    /* WHERE c
17850 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61  lause for partia
17860 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
17870 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
17880 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
17890 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
178a0 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
178b0 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
178c0 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
178d0 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
178e0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
178f0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65  .){.  Index *pRe
17900 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f  t = 0;     /* Po
17910 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
17920 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
17930 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
17940 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17950 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
17960 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
17970 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
17980 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
17990 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
179a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
179b0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
179c0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
179d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
179e0 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
179f0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
17a00 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
17a10 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
17a20 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
17a30 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
17a40 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
17a50 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
17a60 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
17a70 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
17a80 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
17a90 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17aa0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
17ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17ac0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
17ad0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
17ae0 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
17af0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
17b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17b10 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
17b20 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
17b30 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
17b40 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
17b50 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
17b60 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
17b70 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
17b80 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
17b90 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
17ba0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
17bb0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
17bc0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
17bd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17be0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
17bf0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
17c00 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
17c10 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
17c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17c30 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
17c40 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
17c50 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
17c60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17c70 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
17c80 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
17c90 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
17ca0 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
17cb0 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
17cc0 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
17cd0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
17ce0 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
17cf0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
17d00 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 7c  N_DECLARE_VTAB |
17d10 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
17d20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
17d30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17d40 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
17d50 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
17d60 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
17d70 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17d80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17d90 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
17da0 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
17db0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
17dc0 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
17dd0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
17de0 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
17df0 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
17e00 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
17e10 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
17e20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
17e30 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
17e40 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
17e50 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
17e60 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
17e70 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
17e80 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
17e90 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
17ea0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
17eb0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
17ec0 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
17ed0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
17ee0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
17ef0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
17f00 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
17f10 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17f20 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
17f30 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e  ert( pName && pN
17f40 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64  ame->z );..#ifnd
17f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
17f60 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
17f70 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
17f80 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
17f90 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62  check if the tab
17fa0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
17fb0 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
17fc0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
17fd0 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
17fe0 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
17ff0 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
18000 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18010 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18020 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
18030 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
18040 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
18050 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
18060 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
18070 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
18080 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
18090 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
180a0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
180b0 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
180c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
180d0 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65  ndif..    sqlite
180e0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
180f0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
18100 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  dex", pName);.  
18110 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
18120 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
18130 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  TblName) ){.    
18140 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
18150 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
18160 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
18170 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
18180 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
18190 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
181a0 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
181b0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
181c0 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
181d0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
181e0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
181f0 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d  rse, 0, &pTblNam
18200 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  e->a[0]);.    as
18210 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
18220 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61  Failed==0 || pTa
18230 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
18240 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
18250 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18260 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
18270 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d   && db->aDb[iDb]
18280 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e  .pSchema!=pTab->
18290 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
182a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
182b0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
182c0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65       "cannot cre
182d0 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78  ate a TEMP index
182e0 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62   on non-TEMP tab
182f0 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  le \"%s\"",.    
18300 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
18310 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
18320 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18330 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
18340 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
18350 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33   ) pPk = sqlite3
18360 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
18370 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
18380 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18390 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
183a0 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
183b0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
183c0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
183d0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
183e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
183f0 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
18400 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
18410 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
18420 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
18430 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
18440 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
18450 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
18460 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
18470 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
18480 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
18490 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
184a0 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
184b0 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e      && db->init.
184c0 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49  busy==0.#if SQLI
184d0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
184e0 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26  CATION.       &&
184f0 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
18500 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d  Table(pTab->zNam
18510 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20  e)==0.#endif.   
18520 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
18530 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  rNICmp(&pTab->zN
18540 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
18550 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
18560 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18570 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
18580 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
18590 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
185a0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
185b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
185c0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
185d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
185e0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
185f0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
18600 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18610 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
18620 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18630 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18640 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18650 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
18660 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18670 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
18680 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
18690 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
186a0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
186b0 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
186c0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
186d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
186e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
186f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
18700 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
18710 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
18720 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
18730 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
18740 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
18750 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
18760 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
18770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
18780 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
18790 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
187a0 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
187b0 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
187c0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
187d0 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
187e0 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
187f0 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
18800 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
18810 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
18820 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
18830 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
18840 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
18850 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
18860 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
18870 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
18880 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
18890 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
188a0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
188b0 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
188c0 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
188d0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
188e0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
188f0 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
18900 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
18910 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
18920 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
18930 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
18940 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18950 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
18960 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
18970 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18980 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
18990 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a   pName->z!=0 );.
189a0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
189b0 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
189c0 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
189d0 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
189e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
189f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18a00 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
18a10 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
18a20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
18a30 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
18a40 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
18a50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18a60 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
18a70 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
18a80 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
18a90 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
18aa0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18ab0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
18ac0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18ad0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
18ae0 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
18af0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
18b00 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
18b10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18b20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18b30 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
18b40 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
18b50 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
18b60 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
18b70 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
18b80 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
18b90 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
18ba0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
18bb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18bc0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18bd0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18bf0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
18c00 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
18c10 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
18c20 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
18c30 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
18c40 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
18c50 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
18c60 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
18c70 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
18c80 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
18c90 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
18ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
18cb0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18cc0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ex;.    }.  }.. 
18cd0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
18ce0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
18cf0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
18d00 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
18d10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
18d20 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
18d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
18d40 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
18d50 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18d60 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18d70 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
18d80 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
18d90 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
18da0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18db0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18dc0 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
18dd0 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
18de0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
18df0 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
18e00 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
18e10 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
18e20 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
18e30 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
18e40 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
18e50 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
18e60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18e70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18e80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18e90 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
18ea0 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
18eb0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
18ec0 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
18ed0 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
18ee0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
18ef0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
18f00 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
18f10 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
18f20 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
18f30 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
18f40 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
18f50 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
18f60 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
18f70 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
18f80 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61  it(&prevCol, pTa
18f90 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
18fa0 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
18fb0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
18fc0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
18fd0 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
18fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18ff0 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
19000 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30  _ID, &prevCol, 0
19010 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
19020 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
19030 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19040 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
19050 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
19060 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
19070 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c  tSetSortOrder(pL
19080 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b  ist, sortOrder);
19090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
190a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
190b0 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
190c0 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29   pList, "index")
190d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
190e0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
190f0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
19100 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
19110 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
19120 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
19130 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19140 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
19150 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
19160 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19170 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
19180 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19190 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
191a0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
191b0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
191c0 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
191d0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
191e0 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
191f0 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
19200 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
19210 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
19220 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
19230 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
19240 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
19250 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
19260 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
19270 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
19280 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20  l : 1;.  pIndex 
19290 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
192a0 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
192b0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
192c0 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20  nExtraCol,.     
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20   nName + nExtra 
19300 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20  + 1, &zExtra);. 
19310 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19320 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
19330 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19340 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
19350 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
19360 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
19370 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a  aiRowLogEst) );.
19380 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
19390 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
193a0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
193b0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
193c0 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
193d0 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
193e0 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
193f0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
19400 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
19410 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
19420 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
19430 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
19440 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
19450 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
19460 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
19470 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70    pIndex->idxTyp
19480 65 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49  e = pName ? SQLI
19490 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
194a0 46 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54 59  F : SQLITE_IDXTY
194b0 50 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e  PE_UNIQUE;.  pIn
194c0 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
194d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
194e0 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  ema;.  pIndex->n
194f0 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e  KeyCol = pList->
19500 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49  nExpr;.  if( pPI
19510 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
19520 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
19530 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
19540 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64   pTab, NC_PartId
19550 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b  x, pPIWhere, 0);
19560 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61  .    pIndex->pPa
19570 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49  rtIdxWhere = pPI
19580 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68  Where;.    pPIWh
19590 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ere = 0;.  }.  a
195a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
195b0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
195c0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20  , iDb, 0) );..  
195d0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
195e0 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
195f0 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
19600 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
19610 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
19620 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
19630 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
19640 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
19650 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
19660 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
19670 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
19680 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
19690 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
196a0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74  ..  /* Analyze t
196b0 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
196c0 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d  ssions that form
196d0 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
196e0 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a  e index and.  **
196f0 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f   report any erro
19700 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d  rs.  In the comm
19710 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
19720 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19730 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74  exactly.  ** a t
19740 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f  able column, sto
19750 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  re that column i
19760 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46  n aiColumn[].  F
19770 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65  or general expre
19780 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70  ssions,.  ** pop
19790 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43  ulate pIndex->aC
197a0 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65  olExpr and store
197b0 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e   XN_EXPR (-2) in
197c0 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a   aiColumn[]..  *
197d0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  *.  ** TODO: Iss
197e0 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
197f0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  two or more colu
19800 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
19810 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a   are identical..
19820 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
19830 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68   a warning if th
19840 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20  e table primary 
19850 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70  key is used as p
19860 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
19870 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a  index key..  */.
19880 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
19890 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
198a0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
198b0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
198c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78  {.    Expr *pCEx
198d0 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
198e0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
198f0 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
19900 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71  n */.    int req
19910 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19920 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f          /* ASC o
19930 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d  r DESC on the i-
19940 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
19950 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19960 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
19970 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
19980 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
19990 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  /..    sqlite3St
199a0 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74  ringToId(pListIt
199b0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
199c0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
199d0 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
199e0 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78  se, pTab, NC_Idx
199f0 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d  Expr, pListItem-
19a00 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >pExpr, 0);.    
19a10 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19a20 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19a30 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
19a40 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
19a50 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
19a60 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
19a70 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72  ;.    if( pCExpr
19a80 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
19a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
19aa0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
19ab0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
19ac0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19ad0 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73  pParse, "express
19ae0 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
19af0 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  in PRIMARY KEY a
19b00 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd ".           
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
19b30 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
19b40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19b50 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19b60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
19b70 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  ndex->aColExpr==
19b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
19b90 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73  rList *pCopy = s
19ba0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
19bb0 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b  p(db, pList, 0);
19bc0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
19bd0 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70  >aColExpr = pCop
19be0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
19bf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
19c10 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29  sert( pCopy!=0 )
19c20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73  ;.          pLis
19c30 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e  tItem = &pCopy->
19c40 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
19c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
19c60 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
19c70 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
19c80 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a  n[i] = XN_EXPR;.
19c90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
19ca0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
19cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19cc0 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c  j = pCExpr->iCol
19cd0 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  umn;.      asser
19ce0 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
19cf0 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b        if( j<0 ){
19d00 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61  .        j = pTa
19d10 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
19d20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
19d30 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
19d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
19d50 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
19d60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
19d70 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
19d80 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
19d90 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  j;.    }.    zCo
19da0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
19db0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19dc0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
19dd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
19de0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
19df0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
19e00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
19e10 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
19e20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
19e30 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
19e40 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
19e50 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
19e60 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
19e70 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
19e80 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
19e90 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
19ea0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
19eb0 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
19ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e      }else if( j>
19ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 ){.      zCol
19ee0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
19ef0 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].zColl;.    }. 
19f00 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
19f10 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  zColl = sqlite3S
19f20 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66  trBINARY;.    if
19f30 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
19f40 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
19f50 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
19f60 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
19f70 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19f80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19f90 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19fa0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
19fb0 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
19fc0 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
19fd0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
19fe0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
19ff0 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1a000 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
1a010 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1a020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1a030 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79  nd the table key
1a040 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1a050 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57  he index.  For W
1a060 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a  ITHOUT ROWID.  *
1a070 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  * tables (when p
1a080 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk!=0) this will
1a090 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64   be the declared
1a0a0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
1a0b0 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74  or.  ** normal t
1a0c0 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d  ables (when pPk=
1a0d0 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1a0e0 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f   the rowid..  */
1a0f0 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
1a100 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1a110 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1a120 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
1a130 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
1a140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78  .      assert( x
1a150 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1a160 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65   hasColumn(pInde
1a170 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e  x->aiColumn, pIn
1a180 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29  dex->nKeyCol, x)
1a190 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1a1a0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a  ex->nColumn--; .
1a1b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a1c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1a1d0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20  olumn[i] = x;.  
1a1e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a        pIndex->az
1a1f0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[i] = pPk->a
1a200 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  zColl[j];.      
1a210 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1a220 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  rder[i] = pPk->a
1a230 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
1a240 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1a250 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1a260 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e  ert( i==pIndex->
1a270 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c  nColumn );.  }el
1a280 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  se{.    pIndex->
1a290 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1a2a0 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64  _ROWID;.    pInd
1a2b0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a2c0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1a2d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1a2e0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
1a2f0 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
1a300 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
1a310 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
1a320 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
1a330 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
1a340 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72  ex contains ever
1a350 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20  y column of its 
1a360 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b  table, then mark
1a370 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f  .  ** it as a co
1a380 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1a390 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77    assert( HasRow
1a3a0 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20  id(pTab) .      
1a3b0 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  || pTab->iPKey<0
1a3c0 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   || sqlite3Colum
1a3d0 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1a3e0 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30   pTab->iPKey)>=0
1a3f0 20 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   );.  if( pTblNa
1a400 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  me!=0 && pIndex-
1a410 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e  >nColumn>=pTab->
1a420 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64  nCol ){.    pInd
1a430 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1a440 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   1;.    for(j=0;
1a450 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1a460 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  ++){.      if( j
1a470 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20  ==pTab->iPKey ) 
1a480 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a490 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  if( sqlite3Colum
1a4a0 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1a4b0 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  j)>=0 ) continue
1a4c0 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1a4d0 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a  isCovering = 0;.
1a4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a4f0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54   }.  }..  if( pT
1a500 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1a510 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
1a520 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
1a530 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
1a540 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
1a550 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
1a560 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
1a570 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1a580 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
1a590 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
1a5a0 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
1a5b0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1a5c0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1a5d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
1a5e0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
1a5f0 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
1a600 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
1a610 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1a620 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
1a630 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
1a640 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
1a650 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
1a660 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1a670 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
1a680 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
1a690 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
1a6a0 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
1a6b0 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
1a6c0 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
1a6d0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
1a6e0 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
1a6f0 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
1a700 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1a710 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
1a720 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
1a730 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
1a740 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
1a750 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1a760 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
1a770 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1a780 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
1a790 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
1a7a0 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
1a7b0 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
1a7c0 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
1a7d0 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
1a7e0 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
1a7f0 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
1a800 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
1a810 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
1a820 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1a830 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
1a840 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
1a850 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1a860 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
1a870 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
1a880 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
1a890 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
1a8a0 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
1a8b0 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
1a8c0 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
1a8d0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
1a8e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
1a8f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
1a900 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
1a910 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
1a920 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1a930 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1a940 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1a950 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a960 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  pIdx->idxType!=S
1a970 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1a980 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73  PDEF );.      as
1a990 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1a9a0 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a  dex(pIndex) );..
1a9b0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1a9c0 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
1a9d0 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
1a9e0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
1a9f0 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
1aa00 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
1aa10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1aa20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
1aa30 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
1aa40 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1aa50 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20  >aiColumn[k]>=0 
1aa60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1aa70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1aa80 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
1aa90 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
1aaa0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
1aab0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1aac0 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
1aad0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1aae0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1aaf0 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
1ab00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
1ab10 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
1ab20 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
1ab30 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1ab40 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
1ab50 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
1ab60 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1ab70 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
1ab80 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
1ab90 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
1aba0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1abb0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
1abc0 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
1abd0 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
1abe0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
1abf0 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
1ac00 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
1ac10 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
1ac20 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
1ac30 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
1ac40 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
1ac50 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
1ac60 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
1ac70 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
1ac80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
1ac90 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1aca0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
1acb0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
1acc0 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
1acd0 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
1ace0 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
1acf0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
1ad00 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1ad10 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
1ad20 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1ad30 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
1ad40 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1ad50 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
1ad60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1ad70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
1ada0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1adb0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
1adc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1add0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1ade0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1adf0 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
1ae00 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
1ae10 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
1ae20 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
1ae30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ae40 20 20 20 70 52 65 74 20 3d 20 70 49 64 78 3b 0a     pRet = pIdx;.
1ae50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1ae60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1ae70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ae80 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  }..  /* Link the
1ae90 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
1aea0 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
1aeb0 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
1aec0 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  er.  ** in-memor
1aed0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1aee0 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61  tures. .  */.  a
1aef0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1af00 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
1af10 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
1af20 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
1af30 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1af40 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1af50 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
1af60 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
1af70 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
1af80 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
1af90 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
1afa0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
1afc0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  dex->zName, pInd
1afd0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
1afe0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1aff0 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
1b000 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
1b010 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
1b020 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
1b030 74 28 64 62 29 3b 0a 20 20 20 20 20 20 67 6f 74  t(db);.      got
1b040 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b050 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  dex;.    }.    d
1b060 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
1b070 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
1b080 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
1b090 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  me!=0 ){.      p
1b0a0 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62  Index->tnum = db
1b0b0 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
1b0c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1b0d0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69  If this is the i
1b0e0 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e  nitial CREATE IN
1b0f0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f  DEX statement (o
1b100 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69  r CREATE TABLE i
1b110 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  f the.  ** index
1b120 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69   is an implied i
1b130 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55  ndex for a UNIQU
1b140 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1b150 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65   constraint) the
1b160 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65  n.  ** emit code
1b170 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
1b180 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20   index rootpage 
1b190 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65  on disk and make
1b1a0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20   an entry for.  
1b1b0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  ** the index in 
1b1c0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1b1d0 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75  r table and popu
1b1e0 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77  late the index w
1b1f0 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  ith.  ** content
1b200 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64  .  But, do not d
1b210 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65  o this if we are
1b220 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20   simply reading 
1b230 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1b240 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20  r.  ** table to 
1b250 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
1b260 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64  , or if this ind
1b270 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41 52  ex is the PRIMAR
1b280 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a  Y KEY index.  **
1b290 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
1b2a0 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  WID table..  **.
1b2b0 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
1b2c0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
1b2d0 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
1b2e0 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69  ated as an impli
1b2f0 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20  ed PRIMARY KEY. 
1b300 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e   ** or UNIQUE in
1b310 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20  dex in a CREATE 
1b320 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
1b330 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
1b340 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
1b350 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
1b360 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1b370 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
1b380 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1b390 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
1b3a0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
1b3b0 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69  else if( HasRowi
1b3c0 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e  d(pTab) || pTblN
1b3d0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 56 64  ame!=0 ){.    Vd
1b3e0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
1b3f0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
1b400 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1b410 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
1b420 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b430 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
1b440 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
1b450 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
1b460 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1b470 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1b480 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1b490 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
1b4a0 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
1b4b0 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20  the index using 
1b4c0 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74  CreateIndex. But
1b4d0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64   before.    ** d
1b4e0 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20  oing so, code a 
1b4f0 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Noop instruction
1b500 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61   and store its a
1b510 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a  ddress in .    *
1b520 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68  * Index.tnum. Th
1b530 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69  is is required i
1b540 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65  n case this inde
1b550 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  x is actually a 
1b560 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  .    ** PRIMARY 
1b570 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c  KEY and the tabl
1b580 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  e is actually a 
1b590 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1b5a0 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20  ble. In .    ** 
1b5b0 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f  that case the co
1b5c0 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
1b5d0 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  widTable() routi
1b5e0 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a  ne will replace.
1b5f0 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20      ** the Noop 
1b600 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a  with a Goto to j
1b610 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42  ump over the VDB
1b620 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  E code generated
1b630 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70   below. */.    p
1b640 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71  Index->tnum = sq
1b650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1b660 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  v, OP_Noop);.   
1b670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b680 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p2(v, OP_CreateI
1b690 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29  ndex, iDb, iMem)
1b6a0 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
1b6b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
1b6c0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
1b6d0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1b6e0 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
1b6f0 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
1b700 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1b710 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
1b720 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61  nt n = (int)(pPa
1b730 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1b740 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  z - pName->z) + 
1b750 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1b760 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  en.n;.      if( 
1b770 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27  pName->z[n-1]=='
1b780 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20  ;' ) n--;.      
1b790 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
1b7a0 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
1b7b0 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
1b7c0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
1b7d0 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
1b7e0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
1b7f0 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
1b800 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  s",.        onEr
1b810 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
1b820 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e  " : " UNIQUE", n
1b830 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
1b840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1b850 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   An automatic in
1b860 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61  dex created by a
1b870 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1b880 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1b890 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53  t */.      /* zS
1b8a0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1b8b0 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
1b8c0 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
1b8d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
1b8e0 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
1b8f0 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
1b900 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  is index.    */.
1b910 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1b920 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
1b930 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1b940 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
1b950 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
1b960 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
1b970 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1b980 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
1b990 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
1b9a0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1b9b0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
1b9c0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
1b9d0 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
1b9e0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
1b9f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1ba00 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
1ba10 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
1ba20 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
1ba30 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
1ba40 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
1ba50 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
1ba60 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
1ba70 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
1ba80 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
1ba90 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
1baa0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1bab0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1bac0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1bad0 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1bae0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1baf0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1bb00 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1bb10 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
1bb20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
1bb30 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
1bb40 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
1bb50 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65  ='index'", pInde
1bb60 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1bb70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bb80 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op1(v, OP_Expire
1bb90 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
1bba0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1bbb0 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1bbc0 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tnum);.  }..  /*
1bbd0 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
1bbe0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
1bbf0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
1bc00 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
1bc10 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
1bc20 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
1bc30 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
1bc40 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
1bc50 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
1bc60 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
1bc70 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
1bc80 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
1bc90 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
1bca0 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
1bcb0 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
1bcc0 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
1bcd0 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
1bce0 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
1bcf0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
1bd00 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
1bd10 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
1bd20 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
1bd30 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
1bd40 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
1bd50 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
1bd60 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
1bd70 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1bd80 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
1bd90 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1bda0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1bdb0 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
1bdc0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1bdd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1bde0 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
1bdf0 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1be00 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
1be10 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
1be20 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
1be30 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
1be40 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
1be50 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1be60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1be70 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
1be80 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1be90 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
1bea0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
1beb0 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78     pRet = pIndex
1bec0 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  ;.    pIndex = 0
1bed0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
1bee0 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
1bef0 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
1bf00 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
1bf10 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64  pIndex ) freeInd
1bf20 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1bf30 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1bf40 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
1bf50 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1bf60 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1bf70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1bf80 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1bf90 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
1bfa0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bfb0 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
1bfc0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
1bfd0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1bfe0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1bff0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1c000 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1c010 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1c020 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1c030 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1c040 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1c050 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1c060 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1c070 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1c080 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1c090 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1c0a0 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1c0b0 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1c0c0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1c0d0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1c0e0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1c0f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1c100 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1c110 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1c120 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1c130 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1c140 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1c150 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1c160 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1c170 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1c180 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1c190 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1c1a0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1c1b0 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1c1c0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1c1d0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1c1e0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1c1f0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1c200 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1c210 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1c220 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1c230 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1c240 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1c250 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1c260 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1c270 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1c280 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1c290 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1c2a0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1c2b0 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1c2c0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1c2d0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1c2e0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1c2f0 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1c300 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1c310 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1c320 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1c330 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1c340 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1c350 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1c360 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1c370 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1c380 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1c390 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1c3a0 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1c3b0 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1c3c0 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1c3d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1c3e0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65   int i;..  /* Se
1c3f0 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  t the first entr
1c400 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  y (number of row
1c410 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20  s in the index) 
1c420 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
1c430 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
1c440 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1c450 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68  le. Or 10, if th
1c460 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
1c470 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a  er of rows .  **
1c480 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73   in the table is
1c490 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e   less than that.
1c4a0 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49    */.  a[0] = pI
1c4b0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
1c4c0 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b  LogEst;.  if( a[
1c4d0 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33  0]<33 ) a[0] = 3
1c4e0 33 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  3;        assert
1c4f0 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 33==sqlite3Log
1c500 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a  Est(10) );..  /*
1c510 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61   Estimate that a
1c520 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20  [1] is 10, a[2] 
1c530 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c  is 9, a[3] is 8,
1c540 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d   a[4] is 7, a[5]
1c550 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65   is.  ** 6 and e
1c560 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76  ach subsequent v
1c570 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73  alue (if any) is
1c580 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79   5.  */.  memcpy
1c590 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43  (&a[1], aVal, nC
1c5a0 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73  opy*sizeof(LogEs
1c5b0 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f  t));.  for(i=nCo
1c5c0 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  py+1; i<=pIdx->n
1c5d0 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1c5e0 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20    a[i] = 23;    
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69  assert( 23==sqli
1c610 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a  te3LogEst(5) );.
1c620 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30    }..  assert( 0
1c630 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1c640 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  1) );.  if( IsUn
1c650 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1c660 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ) a[pIdx->nKeyCo
1c670 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l] = 0;.}../*.**
1c680 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1c690 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1c6a0 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1c6b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1c6c0 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1c6d0 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1c6e0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1c6f0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1c700 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1c710 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1c720 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1c730 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1c740 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1c750 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1c760 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1c770 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1c780 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1c790 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1c7a0 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1c7b0 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1c7c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1c7d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1c7e0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1c7f0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1c800 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1c810 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1c820 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1c830 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1c840 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1c850 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1c860 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1c870 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1c880 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1c890 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1c8a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1c8b0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1c8c0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1c8d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c8e0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1c8f0 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1c900 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1c910 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1c920 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1c930 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1c940 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1c950 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1c960 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1c970 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1c980 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1c990 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1c9a0 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
1c9b0 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1c9c0 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EF ){.    sqlite
1c9d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c9e0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
1c9f0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
1ca00 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
1ca10 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1ca20 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
1ca30 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
1ca40 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1ca50 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
1ca60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1ca70 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1ca80 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
1ca90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1caa0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1cab0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1cac0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
1cad0 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
1cae0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
1caf0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
1cb00 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1cb10 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
1cb20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1cb30 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
1cb40 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
1cb50 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1cb60 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1cb70 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
1cb80 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1cb90 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1cba0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1cbb0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1cbc0 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
1cbd0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
1cbe0 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1cbf0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1cc00 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1cc10 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1cc20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
1cc30 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1cc40 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1cc50 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1cc60 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
1cc70 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
1cc80 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
1cc90 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
1cca0 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
1ccb0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ccc0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1ccd0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1cce0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1ccf0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1cd00 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1cd10 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1cd20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
1cd30 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
1cd40 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
1cd50 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
1cd60 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1cd70 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1cd80 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e  E(iDb), pIndex->
1cd90 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
1cda0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
1cdb0 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
1cdc0 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
1cdd0 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
1cde0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1cdf0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1ce00 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
1ce10 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
1ce20 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
1ce30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ce40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
1ce50 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
1ce60 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
1ce70 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
1ce80 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
1ce90 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1cea0 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
1ceb0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
1cec0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1ced0 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
1cee0 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
1cef0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
1cf00 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
1cf10 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
1cf20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
1cf30 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
1cf40 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
1cf50 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
1cf60 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
1cf70 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
1cf80 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
1cf90 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
1cfa0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
1cfb0 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
1cfc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1cfd0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
1cfe0 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
1cff0 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
1d000 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
1d010 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
1d020 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
1d030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
1d040 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
1d050 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
1d060 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
1d070 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
1d080 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1d090 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
1d0a0 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
1d0b0 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
1d0c0 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
1d0d0 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
1d0e0 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
1d0f0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
1d100 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
1d110 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
1d120 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
1d130 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
1d140 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
1d150 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
1d160 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
1d170 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
1d180 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
1d190 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
1d1a0 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
1d1b0 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
1d1c0 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
1d1d0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1d1e0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d1f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1d200 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1d210 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1d220 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1d230 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
1d240 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1d250 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
1d260 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
1d270 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
1d280 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
1d290 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
1d2a0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
1d2b0 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
1d2c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1d2d0 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
1d2e0 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
1d2f0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
1d300 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
1d310 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
1d320 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
1d330 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
1d340 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
1d350 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
1d360 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
1d370 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
1d380 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1d390 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1d3a0 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
1d3b0 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
1d3c0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1d3d0 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
1d3e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1d3f0 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
1d400 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
1d410 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
1d420 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
1d430 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
1d440 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
1d450 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
1d460 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1d470 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1d480 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1d490 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1d4a0 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1d4b0 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1d4c0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1d4d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1d4e0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1d4f0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1d500 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1d510 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1d520 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
1d530 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1d540 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1d550 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
1d560 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1d570 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1d580 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1d590 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1d5a0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1d5b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1d5c0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1d5d0 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1d5e0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1d5f0 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1d600 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1d610 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1d620 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1d630 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1d640 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1d650 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1d660 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1d670 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1d680 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1d690 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1d6a0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1d6b0 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
1d6c0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1d6d0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1d6e0 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1d6f0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d700 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1d710 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1d720 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1d730 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1d740 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1d750 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1d760 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1d770 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1d780 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1d790 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d7a0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1d7b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d7c0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1d7d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d7e0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1d7f0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1d800 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1d810 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1d820 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1d830 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1d840 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1d850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d860 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1d870 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d880 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1d890 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1d8a0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1d8b0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d8c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1d8d0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1d8e0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1d8f0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1d900 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1d910 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1d920 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1d930 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1d940 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1d950 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1d960 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1d970 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1d980 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1d990 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1d9a0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1d9b0 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1d9c0 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1d9d0 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1d9e0 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1d9f0 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1da00 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1da10 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1da20 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1da30 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1da40 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1da50 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1da60 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1da70 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1da80 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1da90 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1daa0 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1dab0 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1dac0 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1dad0 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1dae0 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1daf0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1db00 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1db10 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1db20 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1db30 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1db40 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1db50 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1db60 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1db70 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1db80 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1db90 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1dba0 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1dbb0 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1dbc0 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1dbd0 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1dbe0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1dbf0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1dc00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1dc10 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1dc20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1dc30 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1dc40 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1dc50 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1dc60 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1dc70 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1dc80 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1dc90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dca0 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1dcb0 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1dcc0 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1dcd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1dce0 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1dcf0 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1dd00 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1dd10 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1dd20 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1dd30 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1dd40 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1dd50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1dd60 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1dd70 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1dd80 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1dd90 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1dda0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1ddb0 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1ddc0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1ddd0 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1dde0 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1ddf0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1de00 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1de10 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1de20 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
1de30 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20      int nGot;.  
1de40 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1de50 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53  DbRealloc(db, pS
1de60 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
1de70 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29     sizeof(*pSrc)
1de80 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69   + (nAlloc-1)*si
1de90 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1dea0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
1deb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1dec0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1ded0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
1dee0 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20  eturn pSrc;.    
1def0 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65  }.    pSrc = pNe
1df00 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73  w;.    nGot = (s
1df10 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
1df20 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73  ze(db, pNew) - s
1df30 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69  izeof(*pSrc))/si
1df40 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1df50 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41  +1;.    pSrc->nA
1df60 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d  lloc = nGot;.  }
1df70 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
1df80 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
1df90 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
1dfa0 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
1dfb0 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
1dfc0 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
1dfd0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
1dfe0 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
1dff0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
1e000 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
1e010 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
1e020 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61  ->nSrc += nExtra
1e030 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
1e040 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
1e050 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
1e060 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
1e070 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
1e080 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
1e090 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
1e0a0 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
1e0b0 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
1e0c0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
1e0d0 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
1e0e0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1e0f0 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
1e100 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
1e110 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
1e120 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1e130 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
1e140 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
1e150 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1e160 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
1e170 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
1e180 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
1e190 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
1e1a0 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
1e1b0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
1e1c0 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
1e1d0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1e1e0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
1e1f0 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74   error.  The ret
1e200 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
1e210 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
1e220 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
1e230 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
1e240 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
1e250 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
1e260 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
1e270 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
1e280 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
1e290 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
1e2a0 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
1e2b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
1e2c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
1e2d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
1e2e0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
1e2f0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1e300 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
1e310 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
1e320 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
1e330 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
1e340 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
1e350 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
1e360 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
1e370 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1e380 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
1e390 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
1e3a0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
1e3b0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
1e3c0 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
1e3d0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1e3e0 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
1e3f0 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
1e400 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
1e410 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
1e420 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
1e430 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
1e440 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
1e450 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
1e460 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
1e470 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
1e480 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
1e490 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
1e4a0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
1e4b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1e4c0 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
1e4d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1e4e0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e4f0 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
1e500 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
1e510 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1e520 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1e530 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
1e540 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
1e550 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1e560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1e570 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1e580 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
1e590 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
1e5a0 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
1e5b0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1e5c0 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
1e5d0 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
1e5e0 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
1e5f0 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
1e600 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
1e610 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1e620 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e630 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
1e640 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
1e650 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
1e660 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
1e670 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
1e680 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
1e690 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
1e6a0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
1e6b0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1e6c0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e6d0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1e6e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1e6f0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1e700 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1e710 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
1e720 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
1e730 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
1e740 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
1e750 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
1e760 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
1e770 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
1e780 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
1e790 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
1e7a0 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
1e7b0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
1e7c0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1e7d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1e7e0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  em;.  assert( pD
1e7f0 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
1e800 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
1e810 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
1e820 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65  hout B */.  asse
1e830 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
1e840 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1e850 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1e860 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
1e870 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  db, sizeof(SrcLi
1e880 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
1e890 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1e8a0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
1e8b0 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70  Alloc = 1;.    p
1e8c0 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a  List->nSrc = 0;.
1e8d0 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
1e8e0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1e8f0 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
1e900 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
1e910 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1e920 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1e930 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1e940 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1e950 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1e960 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1e970 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1e980 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1e990 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1e9a0 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1e9b0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1e9c0 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1e9d0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1e9e0 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1e9f0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1ea00 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1ea10 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1ea20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1ea30 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1ea40 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1ea50 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1ea60 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1ea70 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ea80 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1ea90 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1eaa0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1eab0 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1eac0 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1ead0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1eae0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1eaf0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1eb00 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1eb10 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1eb20 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1eb30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1eb40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1eb50 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1eb60 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1eb70 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1eb80 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1eb90 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1eba0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1ebb0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1ebc0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1ebd0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1ebe0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1ebf0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1ec00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1ec10 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1ec20 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1ec30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1ec40 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1ec50 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1ec60 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1ec70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ec80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1ec90 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1eca0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1ecb0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1ecc0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1ecd0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1ece0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1ecf0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1ed00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1ed10 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ed20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1ed30 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1ed40 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1ed50 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1ed60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1ed70 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1ed80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ed90 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1eda0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1edb0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1edc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1edd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ede0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1edf0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1ee00 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
1ee10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ee20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1ee30 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
1ee40 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1ee50 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
1ee60 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ee70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1ee80 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1ee90 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1eea0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1eeb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1eec0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1eed0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1eee0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1eef0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1ef00 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1ef10 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1ef20 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1ef30 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1ef40 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1ef50 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ef60 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1ef70 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1ef80 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1ef90 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1efa0 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1efb0 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1efc0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1efd0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1efe0 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1eff0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f000 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1f010 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1f020 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1f030 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1f040 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1f050 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1f060 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1f070 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1f080 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1f090 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f0a0 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1f0b0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1f0c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1f0d0 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1f0e0 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1f0f0 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1f100 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1f110 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
1f120 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1f130 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1f140 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1f150 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1f160 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1f170 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1f180 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1f190 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1f1a0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1f1b0 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1f1c0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1f1d0 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1f1e0 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1f1f0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1f200 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1f210 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1f220 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f230 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1f240 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1f250 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1f260 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1f270 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1f280 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1f290 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1f2a0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1f2b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1f2d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1f2e0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1f2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f300 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1f310 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1f320 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1f330 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1f340 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f350 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1f360 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1f370 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1f380 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1f390 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1f3a0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1f3b0 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1f3c0 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1f3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f3e0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1f3f0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1f400 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1f410 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1f420 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1f430 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1f440 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1f450 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1f460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f470 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1f480 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1f490 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1f4a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1f4b0 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1f4c0 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1f4d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f4e0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1f4f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f500 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1f510 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1f520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1f530 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1f540 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1f550 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1f560 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1f570 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1f580 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1f590 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1f5a0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1f5b0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1f5c0 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1f5d0 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1f5e0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1f5f0 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1f600 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1f610 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1f620 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1f630 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1f640 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1f650 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1f660 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1f670 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1f680 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f690 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1f6a0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1f6b0 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1f6c0 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1f6d0 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1f6e0 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1f6f0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1f700 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1f710 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1f720 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1f730 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1f740 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1f750 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1f760 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1f770 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1f780 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1f790 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1f7a0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1f7b0 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1f7c0 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1f7d0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1f7e0 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1f7f0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1f800 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1f810 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1f820 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f830 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1f840 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f850 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1f860 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1f870 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1f880 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1f890 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1f8a0 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1f8b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f8c0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1f8d0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f8e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1f8f0 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1f900 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f910 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1f920 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1f930 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1f940 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1f950 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1f960 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1f970 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1f980 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1f990 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1f9a0 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1f9b0 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1f9c0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1f9d0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1f9e0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1f9f0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
1fa00 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1fa10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1fa20 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1fa30 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
1fa40 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1fa50 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1fa60 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1fa70 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
1fa80 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64   (pItem->u1.zInd
1fa90 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20  exedBy!=0);.    
1faa0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1fab0 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
1fac0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1fad0 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
1fae0 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
1faf0 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
1fb00 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1fb10 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
1fb20 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
1fb30 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1fb40 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1fb50 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1fb60 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1fb70 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1fb80 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1fb90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1fba0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
1fbb0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1fbc0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
1fbd0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
1fbe0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1fbf0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
1fc00 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
1fc10 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
1fc20 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
1fc30 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
1fc40 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1fc50 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1fc60 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
1fc70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
1fc80 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
1fc90 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
1fca0 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
1fcb0 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
1fcc0 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
1fcd0 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
1fce0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
1fcf0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
1fd00 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
1fd10 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
1fd20 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
1fd30 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
1fd40 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
1fd50 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
1fd60 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
1fd70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1fd80 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
1fd90 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
1fda0 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
1fdb0 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
1fdc0 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
1fdd0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1fde0 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
1fdf0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
1fe00 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
1fe10 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
1fe20 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
1fe30 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
1fe40 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
1fe50 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
1fe60 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
1fe70 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
1fe80 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
1fe90 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
1fea0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1feb0 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
1fec0 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
1fed0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1fee0 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
1fef0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
1ff00 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1ff10 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
1ff20 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
1ff30 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
1ff40 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
1ff50 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
1ff60 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
1ff70 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
1ff80 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
1ff90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ffa0 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
1ffb0 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
1ffc0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1ffd0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1ffe0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1fff0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
20000 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
20010 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
20020 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
20030 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
20040 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
20050 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
20060 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20070 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20080 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20090 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
200a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
200b0 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
200c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
200d0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
200e0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
200f0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
20100 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
20110 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20130 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
20140 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
20150 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
20160 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
20170 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
20180 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
20190 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
201a0 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp0(v, OP_AutoC
201b0 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ommit);.}../*.**
201c0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
201d0 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ode for a COMMIT
201e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
201f0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
20200 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
20210 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
20220 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
20230 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
20240 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20250 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
20260 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20270 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20280 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
20290 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
202a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
202b0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
202c0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
202d0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
202e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
202f0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
20300 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
20310 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
20320 20 63 6f 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c   code for a ROLL
20330 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a  BACK statement..
20340 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
20350 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
20360 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
20370 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  ){.  Vdbe *v;.. 
20380 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
20390 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
203a0 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
203b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
203c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
203d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
203e0 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
203f0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
20400 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
20410 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
20420 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
20430 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
20440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
20450 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
20460 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
20470 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20480 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
20490 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
204a0 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
204b0 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
204c0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
204d0 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
204e0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
204f0 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
20500 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
20510 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
20520 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
20530 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20540 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
20550 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
20560 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
20570 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
20580 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
20590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
205a0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
205b0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
205c0 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
205d0 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c  z[] = { "BEGIN",
205e0 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c   "RELEASE", "ROL
205f0 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73  LBACK" };.    as
20600 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54  sert( !SAVEPOINT
20610 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f  _BEGIN && SAVEPO
20620 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26  INT_RELEASE==1 &
20630 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  & SAVEPOINT_ROLL
20640 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  BACK==2 );.#endi
20650 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20  f.    if( !v || 
20660 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20670 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20680 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70  SAVEPOINT, az[op
20690 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  ], zName, 0) ){.
206a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
206b0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
206c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
206d0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
206e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
206f0 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e  4(v, OP_Savepoin
20700 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61  t, op, 0, 0, zNa
20710 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
20720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
20730 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
20740 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
20750 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
20760 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
20770 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
20780 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
20790 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
207a0 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
207b0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
207c0 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
207d0 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
207e0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
207f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20800 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
20810 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
20820 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
20830 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
20840 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  c;.    Btree *pB
20850 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  t;.    static co
20860 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
20870 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20880 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
20890 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
208a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
208b0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
208c0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
208d0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
208e0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
208f0 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
20900 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
20910 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
20920 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
20930 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
20940 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
20950 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
20960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20970 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20980 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
20990 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
209a0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
209b0 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
209c0 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
209d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
209e0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
209f0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
20a00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20a10 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
20a20 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
20a30 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
20a40 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
20a50 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
20a60 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
20a70 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
20a80 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
20a90 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
20aa0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
20ab0 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
20ac0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
20ad0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20ae0 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66  .** Record the f
20af0 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68  act that the sch
20b00 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20  ema cookie will 
20b10 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66  need to be verif
20b20 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62  ied.** for datab
20b30 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f  ase iDb.  The co
20b40 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76  de to actually v
20b50 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
20b60 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20   cookie.** will 
20b70 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
20b80 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
20b90 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20  l VDBE and will 
20ba0 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  be generated.** 
20bb0 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65  later, by sqlite
20bc0 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
20bd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20be0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
20bf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20c00 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
20c10 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
20c20 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
20c30 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
20c40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f  qlite3 *db = pTo
20c50 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61  plevel->db;..  a
20c60 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
20c70 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
20c80 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
20c90 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
20ca0 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73   iDb==1 );.  ass
20cb0 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
20cc0 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
20cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20ce0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
20cf0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
20d00 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65  ;.  if( DbMaskTe
20d10 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  st(pToplevel->co
20d20 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d  okieMask, iDb)==
20d30 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  0 ){.    DbMaskS
20d40 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  et(pToplevel->co
20d50 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  okieMask, iDb);.
20d60 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63      pToplevel->c
20d70 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20  ookieValue[iDb] 
20d80 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
20d90 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
20da0 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21  ookie;.    if( !
20db0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
20dc0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db==1 ){.      s
20dd0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
20de0 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c  tabase(pToplevel
20df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
20e00 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  /*.** If argumen
20e10 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74  t zDb is NULL, t
20e20 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  hen call sqlite3
20e30 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
20e40 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  () for each .** 
20e50 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
20e60 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  e. Otherwise, in
20e70 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20  voke it for the 
20e80 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a  database named z
20e90 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  Db only..*/.void
20ea0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
20eb0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61  fyNamedSchema(Pa
20ec0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
20ed0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
20ee0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20ef0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
20f00 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
20f10 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
20f20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
20f30 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
20f40 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28  f( pDb->pBt && (
20f50 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74  !zDb || 0==sqlit
20f60 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70  e3StrICmp(zDb, p
20f70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20  Db->zName)) ){. 
20f80 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
20f90 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
20fa0 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
20fb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
20fc0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
20fd0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
20fe0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
20ff0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
21000 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
21010 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
21020 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
21030 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
21040 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
21050 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
21060 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
21070 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
21080 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
21090 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
210a0 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
210b0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
210c0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
210d0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
210e0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
210f0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
21100 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
21110 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
21120 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
21130 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
21140 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
21150 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
21160 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
21170 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
21180 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
21190 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
211a0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
211b0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
211c0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
211d0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
211e0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
211f0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
21200 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
21210 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
21220 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
21230 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
21240 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
21250 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
21260 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
21270 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
21280 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21290 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
212a0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
212b0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
212c0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
212d0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
212e0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
212f0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
21300 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
21310 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
21320 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
21330 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
21340 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
21350 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
21360 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
21370 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
21380 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
21390 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
213a0 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
213b0 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
213c0 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
213d0 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
213e0 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
213f0 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
21400 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
21410 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
21420 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
21430 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
21440 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
21450 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
21460 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
21470 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
21480 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
21490 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
214a0 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
214b0 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
214c0 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
214d0 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
214e0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
214f0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
21500 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
21510 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
21520 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
21530 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
21540 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
21550 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
21560 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
21570 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
21580 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
21590 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
215a0 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
215b0 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
215c0 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
215d0 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
215e0 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
215f0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
21600 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
21610 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
21620 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
21630 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
21640 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21650 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
21660 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
21670 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
21680 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
21690 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
216a0 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
216b0 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
216c0 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
216d0 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
216e0 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
216f0 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
21700 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
21710 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
21720 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
21730 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
21740 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
21750 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
21760 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
21770 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
21780 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
21790 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
217a0 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
217b0 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
217c0 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
217d0 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
217e0 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
217f0 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
21800 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
21810 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
21820 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
21830 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
21840 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
21850 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
21860 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
21870 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
21880 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
21890 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
218a0 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
218b0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
218c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
218d0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
218e0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
218f0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
21900 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
21910 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
21920 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
21930 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
21940 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
21950 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
21960 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
21970 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
21980 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
21990 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
219a0 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
219b0 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
219c0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
219d0 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
219e0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
219f0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
21a00 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
21a10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
21a20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
21a30 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
21a40 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
21a50 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
21a60 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
21a70 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
21a80 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
21a90 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
21aa0 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
21ab0 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
21ac0 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
21ad0 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
21ae0 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
21af0 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
21b00 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
21b10 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
21b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
21b30 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
21b40 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
21b50 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
21b60 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
21b70 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
21b80 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
21b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21ba0 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
21bb0 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
21bc0 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
21bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21be0 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
21bf0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
21c00 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
21c10 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
21c20 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
21c30 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
21c40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
21c50 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
21c60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21c70 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
21c80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
21c90 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
21ca0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
21cb0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
21cc0 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
21cd0 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
21ce0 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
21cf0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
21d00 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
21d10 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
21d20 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
21d30 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
21d40 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
21d50 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
21d60 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
21d70 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70  0, 200);.  if( p
21d80 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b  Idx->aColExpr ){
21d90 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69  .    sqlite3XPri
21da0 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ntf(&errMsg, "in
21db0 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
21dc0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
21dd0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
21de0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
21df0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
21e00 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
21e10 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
21e20 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
21e30 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
21e40 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
21e50 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
21e60 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
21e70 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
21e80 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
21e90 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
21ea0 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72  ite3XPrintf(&err
21eb0 4d 73 67 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  Msg, "%s.%s", pT
21ec0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
21ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45  ;.    }.  }.  zE
21ee0 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  rr = sqlite3StrA
21ef0 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d  ccumFinish(&errM
21f00 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61  sg);.  sqlite3Ha
21f10 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
21f20 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d  rse, .    IsPrim
21f30 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
21f40 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ) ? SQLITE_CONST
21f50 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
21f60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
21f80 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
21f90 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
21fa0 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
21fb0 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
21fc0 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
21fd0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
21fe0 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
21ff0 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
22000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22010 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
22020 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22030 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
22040 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
22050 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
22060 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
22070 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
22080 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
22090 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
220a0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
220b0 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
220c0 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
220d0 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
220e0 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
220f0 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
22100 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
22110 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
22120 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
22130 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22140 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
22150 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
22160 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
22170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
22180 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
22190 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
221a0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
221b0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
221c0 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
221d0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
221e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
221f0 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
22200 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
22210 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
22220 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
22230 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
22240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22250 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
22260 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
22270 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
22280 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
22290 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
222a0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
222b0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
222c0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
222d0 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
222e0 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
222f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22300 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
22310 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
22320 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
22330 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
22340 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
22350 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
22360 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22370 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
22380 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
22390 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
223a0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
223b0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
223c0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
223d0 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
223e0 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
223f0 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
22400 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
22410 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
22420 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22430 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22440 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22450 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
22460 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
22470 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
22480 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22490 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
224a0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
224b0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
224c0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
224d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
224e0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
224f0 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
22500 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22510 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
22520 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
22530 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22550 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
22560 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
22570 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
22580 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
22590 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
225a0 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
225b0 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
225c0 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
225d0 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
225e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
225f0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
22600 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
22610 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
22620 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
22630 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
22640 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
22650 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
22660 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
22670 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
22680 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
22690 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
226a0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
226b0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
226c0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
226d0 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
226e0 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
226f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22700 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
22710 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22720 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
22730 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
22740 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22750 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22760 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
22770 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
22780 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
22790 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
227a0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
227c0 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
227d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22800 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
22810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
22820 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
22830 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22840 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
22850 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22870 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
22880 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
22890 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
228a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
228b0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
228c0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
228d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
228e0 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
228f0 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
22900 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
22910 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
22920 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
22930 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
22940 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
22950 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22960 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
22970 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
22980 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
22990 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
229a0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
229b0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
229c0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
229d0 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
229e0 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
229f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
22a00 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
22a10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22a20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
22a30 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
22a40 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
22a50 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
22a80 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
22a90 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
22aa0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
22ab0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
22ac0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
22ad0 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
22ae0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
22af0 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
22b00 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
22b10 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
22b20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
22b30 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
22b40 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
22b50 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
22b60 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
22b70 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
22b80 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
22b90 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
22ba0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
22bb0 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
22bc0 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
22bd0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
22be0 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
22bf0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22c00 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
22c10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22c20 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
22c30 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
22c40 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
22c50 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
22c60 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
22c70 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22c80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
22c90 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
22ca0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
22cb0 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
22cc0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ce0 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
22cf0 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
22d00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
22d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22d20 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
22d30 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
22d40 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
22d50 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
22d60 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
22d70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
22d80 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
22d90 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
22da0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
22db0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22de0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
22df0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
22e00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
22e10 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22e20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
22e30 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
22e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22e50 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
22e60 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
22e70 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
22e80 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
22e90 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
22ea0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22eb0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
22ec0 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
22ed0 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
22ee0 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
22ef0 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
22f00 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
22f10 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
22f20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
22f30 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
22f40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
22f50 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
22f60 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
22f70 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
22f80 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
22f90 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
22fa0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
22fb0 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
22fc0 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
22fd0 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
22fe0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
22ff0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
23000 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
23010 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
23020 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23030 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
23040 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
23050 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
23060 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
23070 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
23080 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
23090 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
230a0 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
230b0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
230c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
230d0 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
230e0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
230f0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
23100 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
23110 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
23120 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
23130 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
23140 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
23150 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
23160 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
23170 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
23180 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
23190 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
231a0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
231b0 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
231c0 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
231d0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
231e0 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
231f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23200 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
23210 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
23220 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
23230 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
23240 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23250 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
23260 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
23270 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
23280 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
23290 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
232a0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
232b0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
232c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
232d0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
232e0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
232f0 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
23300 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
23310 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
23320 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
23330 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  urn a KeyInfo st
23340 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
23350 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
23360 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e  the given Index.
23370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e  .**.** The KeyIn
23380 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  fo structure for
23390 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63   an index is cac
233a0 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78  hed in the Index
233b0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74   object..** So t
233c0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75  here might be mu
233d0 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
233e0 73 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65  s to the returne
233f0 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a  d pointer.  The.
23400 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
23410 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69   not try to modi
23420 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  fy the KeyInfo o
23430 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
23440 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69   caller should i
23450 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79  nvoke sqlite3Key
23460 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74  InfoUnref() on t
23470 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
23480 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61  ct.** when it ha
23490 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67  s finished using
234a0 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20   it..*/.KeyInfo 
234b0 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  *sqlite3KeyInfoO
234c0 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  fIndex(Parse *pP
234d0 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
234e0 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
234f0 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
23500 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
23510 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
23520 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
23530 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72  pKey;.  if( pPar
23540 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
23550 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  n 0;.  if( pIdx-
23560 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a  >uniqNotNull ){.
23570 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
23580 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
23590 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
235a0 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d   nCol-nKey);.  }
235b0 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d  else{.    pKey =
235c0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
235d0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
235e0 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20   nCol, 0);.  }. 
235f0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
23600 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23610 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
23620 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  le(pKey) );.    
23630 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
23640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
23650 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
23660 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
23670 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
23680 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d  oll[i] = zColl==
23690 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
236a0 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20   ? 0 :.         
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
236c0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
236d0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
236e0 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
236f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
23700 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
23710 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
23720 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
23730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23740 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
23750 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  y);.      pKey =
23760 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
23770 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a  return pKey;.}..
23780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23790 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54  MIT_CTE./* .** T
237a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
237b0 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20  nvoked once per 
237c0 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65  CTE by the parse
237d0 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20  r while parsing 
237e0 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  a .** WITH claus
237f0 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c  e. .*/.With *sql
23800 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50  ite3WithAdd(.  P
23810 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23820 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
23830 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
23840 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
23850 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69         /* Existi
23860 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20  ng WITH clause, 
23870 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
23880 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
23890 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
238a0 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  the common-table
238b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
238c0 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a  pArglist,     /*
238d0 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e   Optional column
238e0 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74   name list for t
238f0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  he table */.  Se
23900 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20  lect *pQuery    
23910 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75        /* Query u
23920 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
23930 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  e the table */.)
23940 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
23950 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
23960 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68  With *pNew;.  ch
23970 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a  ar *zName;..  /*
23980 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
23990 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  CTE name is uniq
239a0 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57  ue within this W
239b0 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20  ITH clause. If. 
239c0 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61   ** not, store a
239d0 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
239e0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
239f0 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
23a00 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
23a10 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
23a20 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
23a30 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20  e && pWith ){.  
23a40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23a50 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
23a60 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
23a70 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
23a80 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68  Cmp(zName, pWith
23a90 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
23aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23ab0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23ac0 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57  se, "duplicate W
23ad0 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20  ITH table name: 
23ae0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
23af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
23b00 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
23b10 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
23b20 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
23b30 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
23b40 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
23b50 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
23b60 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
23b70 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
23b80 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
23b90 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
23ba0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
23bb0 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
23bc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
23bd0 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65  pNew!=0 && zName
23be0 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  !=0) || db->mall
23bf0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69  ocFailed );..  i
23c00 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
23c10 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
23c20 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23c30 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a  (db, pArglist);.
23c40 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
23c50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65  tDelete(db, pQue
23c60 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
23c70 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
23c80 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57  );.    pNew = pW
23c90 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ith;.  }else{.  
23ca0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
23cb0 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20  nCte].pSelect = 
23cc0 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77  pQuery;.    pNew
23cd0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
23ce0 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74  pCols = pArglist
23cf0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
23d00 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20  ew->nCte].zName 
23d10 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65  = zName;.    pNe
23d20 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
23d30 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  .zCteErr = 0;.  
23d40 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
23d50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
23d60 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
23d70 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
23d80 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
23d90 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
23da0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
23db0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23dc0 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
23dd0 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
23de0 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
23df0 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
23e00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23e10 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
23e20 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
23e30 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
23e40 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
23e50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
23e60 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
23e70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
23e80 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
23e90 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
23ea0 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
23eb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
23ec0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
23ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23ee0 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
23ef0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
23f00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
23f10 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.