/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b4eba1e84752ec9cae7ff3dacd5a8b6d1ab8deb9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  0;.    pToplevel
0a30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
0a40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
0a50: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
0a60: 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75  TableLock instru
0a70: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  ction for each t
0a80: 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74  able locked by t
0a90: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
0aa0: 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63  (configured by c
0ab0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54  alls to sqlite3T
0ac0: 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a  ableLock())..*/.
0ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
0ae0: 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65  TableLocks(Parse
0af0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
0b00: 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62   i;.  Vdbe *pVdb
0b10: 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73  e; ..  pVdbe = s
0b20: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0b30: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
0b40: 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20   pVdbe!=0 ); /* 
0b50: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63  sqlite3GetVdbe c
0b60: 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45  annot fail: VDBE
0b70: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0b80: 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30  ed */..  for(i=0
0b90: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  ; i<pParse->nTab
0ba0: 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  leLock; i++){.  
0bb0: 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d    TableLock *p =
0bc0: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0bd0: 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Lock[i];.    int
0be0: 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20   p1 = p->iDb;.  
0bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0c00: 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61  Op4(pVdbe, OP_Ta
0c10: 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e  bleLock, p1, p->
0c20: 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65  iTab, p->isWrite
0c30: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
0c50: 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29  Name, P4_STATIC)
0c60: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20  ;.  }.}.#else.  
0c70: 23 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c  #define codeTabl
0c80: 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66  eLocks(x).#endif
0c90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
0ca0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
0cb0: 20 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20   yDbMask object 
0cc0: 69 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74  is empty - if it
0cd0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
0ce0: 31 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f  1 bits.  This ro
0cf0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79  utine is used by
0d00: 20 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   the DbMaskAllZe
0d10: 72 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e  ro() and DbMaskN
0d20: 6f 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72  otZero().** macr
0d30: 6f 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d  os when SQLITE_M
0d40: 41 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67  AX_ATTACHED is g
0d50: 72 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a  reater than 30..
0d60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
0d70: 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e  X_ATTACHED>30.in
0d80: 74 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41  t sqlite3DbMaskA
0d90: 6c 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d  llZero(yDbMask m
0da0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
0db0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
0dc0: 79 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69  yDbMask); i++) i
0dd0: 66 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e  f( m[i] ) return
0de0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
0df0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0e00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0e10: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73  called after a s
0e20: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0e30: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e40: 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42  parsed and a VDB
0e50: 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65  E program to exe
0e60: 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  cute that statem
0e70: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e80: 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20  prepared.  This 
0e90: 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65  routine puts the
0ea0: 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68   finishing touch
0eb0: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42  es on the.** VDB
0ec0: 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65  E program and re
0ed0: 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20  sets the pParse 
0ee0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
0ef0: 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e  e next.** parse.
0f00: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
0f10: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
0f20: 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20  urred, it might 
0f30: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
0f40: 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65  .** no VDBE code
0f50: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a   was generated..
0f60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
0f70: 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73  inishCoding(Pars
0f80: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
0f90: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
0fa0: 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
0fb0: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
0fc0: 65 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  el==0 );.  db = 
0fd0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
0fe0: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0ff0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1000: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1010: 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
1020: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  r ){.    if( pPa
1030: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
1040: 4f 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20  OK ) pParse->rc 
1050: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1060: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1070: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1080: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1090: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
10a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10b0: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
10c0: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
10d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10e0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
10f0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
1100: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
1110: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
1120: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
1130: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1140: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1150: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1160: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1170: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1180: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1190: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
11a0: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53  OP_Halt);..#if S
11b0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
11c0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66  NTICATION.    if
11d0: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  ( pParse->nTable
11e0: 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e  Lock>0 && db->in
11f0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
1200: 20 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41      sqlite3UserA
1210: 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20  uthInit(db);.   
1220: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e     if( db->auth.
1230: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
1240: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
1250: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1260: 49 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20  ITE_AUTH_USER;. 
1270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1290: 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74  user not authent
12a0: 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20  icated");.      
12b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
12c0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
12d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
12e0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
12f0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
1300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1310: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
1320: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
1330: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1340: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1350: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1360: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1370: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1380: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1390: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
13a0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
13b0: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
13c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
13d0: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
13e0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
13f0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
1400: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
1410: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1420: 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
1430: 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65   && (DbMaskNonZe
1440: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1450: 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65  eMask) || pParse
1460: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20  ->pConstExpr).  
1470: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69    ){.      int i
1480: 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73  Db, i;.      ass
1490: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
14a0: 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63  GetOp(v, 0)->opc
14b0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a  ode==OP_Init );.
14c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b  eJumpHere(v, 0);
14e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
14f0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
1500: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
1510: 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50  f( DbMaskTest(pP
1520: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1530: 2c 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74  , iDb)==0 ) cont
1540: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
1550: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1560: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
1570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1580: 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20  ddOp4Int(v,.    
1590: 20 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63        OP_Transac
15a0: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
15b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
15c0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
15d0: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
1600: 20 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74        DbMaskTest
1610: 28 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61  (pParse->writeMa
1620: 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a  sk,iDb), /* P2 *
1630: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  /.          pPar
1640: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1650: 69 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f  iDb],          /
1660: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P3 */.        
1670: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
1680: 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74  Schema->iGenerat
1690: 69 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ion  /* P4 */.  
16a0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
16b0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16c0: 73 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  sy==0 ) sqlite3V
16d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
16e0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
16f0: 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20  omment((v,.     
1700: 20 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74           "usesSt
1710: 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70  mtJournal=%d", p
1720: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20  Parse->mayAbort 
1730: 26 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  && pParse->isMul
1740: 74 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20  tiWrite));.     
1750: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1760: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1770: 42 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  BLE.      for(i=
1780: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74  0; i<pParse->nVt
1790: 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  abLock; i++){.  
17a0: 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62        char *vtab
17b0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
17c0: 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
17d0: 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f  pParse->apVtabLo
17e0: 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ck[i]);.        
17f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1800: 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20  4(v, OP_VBegin, 
1810: 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  0, 0, 0, vtab, P
1820: 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  4_VTAB);.      }
1830: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1840: 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65  VtabLock = 0;.#e
1850: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ndif..      /* O
1860: 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b  nce all the cook
1870: 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65  ies have been ve
1880: 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73  rified and trans
1890: 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20  actions opened, 
18a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e  .      ** obtain
18b0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
18c0: 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20  ble-locks. This 
18d0: 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
18e0: 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
18f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
1900: 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
1910: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1920: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  codeTableLocks(p
1930: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
1940: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79  * Initialize any
1950: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64   AUTOINCREMENT d
1960: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72  ata structures r
1970: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a  equired..      *
1980: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  /.      sqlite3A
1990: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69  utoincrementBegi
19a0: 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  n(pParse);..    
19b0: 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61    /* Code consta
19c0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nt expressions t
19d0: 68 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72  hat where factor
19e0: 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20  ed out of inner 
19f0: 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69  loops */.      i
1a00: 66 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  f( pParse->pCons
1a10: 74 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  tExpr ){.       
1a20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d   ExprList *pEL =
1a30: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a40: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
1a50: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
1a60: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
1a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e  for(i=0; i<pEL->
1a80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1a90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1aa0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1ab0: 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  EL->a[i].pExpr, 
1ac0: 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e  pEL->a[i].u.iCon
1ad0: 73 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20  stExprReg);.    
1ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1af0: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c       /* Finally,
1b00: 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   jump back to th
1b10: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1b20: 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f  he executable co
1b30: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  de. */.      sql
1b40: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b50: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  1);.    }.  }...
1b60: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42    /* Get the VDB
1b70: 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20  E program ready 
1b80: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20  for execution.  
1b90: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
1ba0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
1bb0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1bc0: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
1bd0: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1be0: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1bf0: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1c00: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
1c10: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
1c20: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
1c30: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
1c40: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
1c50: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
1c60: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1c70: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1c80: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1c90: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1ca0: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1cb0: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1cc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1cd0: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b  eady(v, pParse);
1ce0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1cf0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
1d10: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1d20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
1d30: 20 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74   We are done wit
1d40: 68 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a  h this Parse obj
1d50: 65 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ect. There is no
1d60: 20 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74   need to de-init
1d70: 69 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66  ialize it */.#if
1d80: 20 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c   0.  pParse->col
1d90: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
1da0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
1db0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1dc0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1dd0: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
1de0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
1df0: 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73  DbMaskZero(pPars
1e00: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a  e->cookieMask);.
1e10: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1e20: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1e30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1e40: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
1e50: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
1e60: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1e70: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1e80: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1e90: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1ea0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1eb0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1ec0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1ed0: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1ee0: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1ef0: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1f00: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1f10: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1f20: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1f30: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1f40: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1f50: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1f60: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1f70: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1f80: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1f90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1fa0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1fb0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1fc0: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1fd0: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1fe0: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1ff0: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2000: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
2010: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
2020: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
2030: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
2040: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
2050: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
2060: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
2070: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
2080: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
2090: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20a0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
20b0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
20c0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
20d0: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
20e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
2100: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
2110: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
2120: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
2130: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
2140: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
2150: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2160: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
2170: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
2180: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
2190: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
21a0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
21b0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
21c0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
21d0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
21e0: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
21f0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2200: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2210: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2220: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
2230: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
2240: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2250: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
2260: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
2270: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
2280: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
2290: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
22a0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
22b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
22c0: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
22d0: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
22e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f0: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2310: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2320: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2330: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
2340: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
2350: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
2360: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
2370: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
2380: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2390: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
23a0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
23b0: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
23c0: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
23d0: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
23e0: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
23f0: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2400: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2420: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2430: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2440: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
2450: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
2460: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
2470: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2480: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2490: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
24a0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
24b0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
24c0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
24d0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
24e0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
24f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2510: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2520: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2530: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2540: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2550: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
2560: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
2570: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
2580: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2590: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
25a0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
25b0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
25c0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
25d0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
25e0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
25f0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2600: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2610: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2620: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2630: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2640: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2650: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2660: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
2670: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2680: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2690: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
26a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
26b0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
26c0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
26d0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
26e0: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
26f0: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2700: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2710: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2720: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2730: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2740: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2750: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
2760: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2770: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
2780: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2790: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
27a0: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
27b0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
27c0: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
27d0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
27e0: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
27f0: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2800: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2810: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2830: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
2840: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2850: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
2860: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2870: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2880: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2890: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
28a0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
28b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
28c0: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
28d0: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
28e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
28f0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2900: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2910: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2920: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2930: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2940: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2950: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
2960: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2970: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2980: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2990: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
29a0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
29b0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
29c0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
29d0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
29e0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
29f0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a00: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a10: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a20: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2a30: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2a40: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2a50: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2a60: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2a70: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2a80: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2a90: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2aa0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2ab0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2ac0: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2ad0: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2ae0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2af0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b00: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b10: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b20: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2b30: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2b40: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2b50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2b60: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2b70: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2b80: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2b90: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2ba0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2bb0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2bc0: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2bd0: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2be0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2bf0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c00: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c10: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c20: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2c30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c40: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2c50: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2c60: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2c70: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2c80: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2c90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ca0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2cb0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2cc0: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2cd0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2ce0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2cf0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d00: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d20: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2d30: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2d40: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2d50: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2d60: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2d70: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2d80: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2d90: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2da0: 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53  able";.#ifndef S
2db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2dc0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2dd0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
2de0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44  e(pParse->db, zD
2df0: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20  base)<1 ){.     
2e00: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2e10: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2e20: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2e30: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2e40: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  d using.      **
2e50: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68   CREATE, then ch
2e60: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2e70: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2e80: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  an virtual table
2e90: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
2ea0: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
2eb0: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
2ec0: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c  . */.      Modul
2ed0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2ee0: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2ef0: 6e 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e  nd(&pParse->db->
2f00: 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b  aModule, zName);
2f10: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20  .      if( pMod 
2f20: 26 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70  && sqlite3VtabEp
2f30: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74  onymousTableInit
2f40: 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29  (pParse, pMod) )
2f50: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f60: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a   pMod->pEpoTab;.
2f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2f80: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62  ndif.    if( zDb
2f90: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
2fa0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2fb0: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
2fc0: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
2fd0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
2fe0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2ff0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3000: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3010: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
3020: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
3030: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
3040: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3050: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
3060: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
3070: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
3080: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
3090: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
30a0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
30b0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
30c0: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
30d0: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
30e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30f0: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3100: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
3110: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
3120: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
3130: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
3140: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
3150: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
3160: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
3170: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
3180: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
3190: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
31a0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
31b0: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
31c0: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
31d0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
31e0: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
31f0: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
3200: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
3210: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3220: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3230: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3240: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3250: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3260: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
3270: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
3280: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3290: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
32a0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
32b0: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
32c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
32d0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
32e0: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
32f0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3300: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3310: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3320: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
3330: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
3340: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
3350: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
3360: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
3370: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
3380: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
3390: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
33a0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
33b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
33c0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
33d0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
33e0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
33f0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
3400: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
3410: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
3420: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
3430: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
3440: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
3450: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
3460: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
3470: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
3480: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
3490: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
34a0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
34b0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
34c0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
34d0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
34e0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
34f0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
3500: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
3510: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
3520: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
3530: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
3540: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
3550: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
3560: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
3570: 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  t i;.  /* All mu
3580: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
3590: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
35a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
35b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
35c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  /.  assert( zDb!
35d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
35e0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
35f0: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
3600: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
3610: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3620: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
3630: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
3640: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
3650: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
3660: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
3670: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
3680: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
3690: 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20   pSchema );.    
36a0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
36b0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
36c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
36d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
36e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3700: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3710: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3720: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3730: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3740: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3750: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3760: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
3770: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
3780: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
3790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
37a0: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
37b0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
37c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37d0: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
37e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
37f0: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3800: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3810: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3820: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3840: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3850: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
3860: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3870: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
3880: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
3890: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
38a0: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
38b0: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
38c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
38d0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
38e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
38f0: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
3900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3910: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3920: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3930: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3940: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3960: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3970: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3980: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3990: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
39a0: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
39b0: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
39c0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
39d0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
39e0: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
39f0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
3a00: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3a10: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3a20: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3a30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3a40: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3a50: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3a60: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3a70: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a80: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a90: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3aa0: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3ab0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3ac0: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3ad0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3ae0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3af0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3b00: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3b10: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3b20: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3b30: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3b40: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3b50: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3b60: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3b70: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3b80: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3b90: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3ba0: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3bb0: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3bc0: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3bd0: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3be0: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3bf0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3c00: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3c10: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3c20: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3c30: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3c40: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3c50: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3c60: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3c70: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3c80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3c90: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
3ca0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
3cb0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
3cc0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
3cd0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
3ce0: 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68  .** Look through
3cf0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65   the list of ope
3d00: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  n database files
3d10: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e   in db->aDb[] an
3d20: 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65  d if.** any have
3d30: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65   been closed, re
3d40: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
3d50: 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f  he list.  Reallo
3d60: 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e  cate the.** db->
3d70: 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20  aDb[] structure 
3d80: 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a  to a smaller siz
3d90: 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a  e, if possible..
3da0: 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74  **.** Entry 0 (t
3db0: 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61  he "main" databa
3dc0: 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20  se) and entry 1 
3dd0: 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61  (the "temp" data
3de0: 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76  base).** are nev
3df0: 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  er candidates fo
3e00: 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65  r being collapse
3e10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3e20: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
3e30: 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  seArray(sqlite3 
3e40: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  *db){.  int i, j
3e50: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  ;.  for(i=j=2; i
3e60: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3e70: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
3e80: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3e90: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3ea0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3eb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ec0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
3ed0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
3ee0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
3ef0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
3f00: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
3f10: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
3f20: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3f30: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d    j++;.  }.  db-
3f40: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3f50: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
3f60: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
3f70: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
3f80: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
3f90: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
3fa0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
3fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
3fc0: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29  ree(db, db->aDb)
3fd0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
3fe0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
3ff0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
4000: 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
4010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
4020: 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73   index iDb.  Als
4030: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54  o reset the.** T
4040: 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76  EMP schema..*/.v
4050: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4060: 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65  OneSchema(sqlite
4070: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
4080: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73  .  Db *pDb;.  as
4090: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
40a0: 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20  b );..  /* Case 
40b0: 31 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69  1:  Reset the si
40c0: 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e  ngle schema iden
40d0: 74 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f  tified by iDb */
40e0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
40f0: 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74  b[iDb];.  assert
4100: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4110: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
4120: 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  , 0) );.  assert
4130: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d  ( pDb->pSchema!=
4140: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  0 );.  sqlite3Sc
4150: 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70  hemaClear(pDb->p
4160: 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49  Schema);..  /* I
4170: 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f  f any database o
4180: 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69  ther than TEMP i
4190: 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c  s reset, then al
41a0: 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20  so reset TEMP.  
41b0: 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69  ** since TEMP mi
41c0: 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74  ght be holding t
41d0: 72 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66  riggers that ref
41e0: 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e  erence tables in
41f0: 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
4200: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
4210: 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
4220: 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44     pDb = &db->aD
4230: 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  b[1];.    assert
4240: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d  ( pDb->pSchema!=
4250: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
4260: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
4270: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
4280: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
4290: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
42a0: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
42b0: 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64  rom all attached
42c0: 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c   databases (incl
42d0: 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20  uding.** "main" 
42e0: 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20  and "temp") for 
42f0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
4300: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
4310: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
4320: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
4330: 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  nnection(sqlite3
4340: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
4350: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
4360: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
4370: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
4380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
4390: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
43a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
43b0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
43c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
43d0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
43e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
43f0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
4400: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4410: 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  s;.  sqlite3Vtab
4420: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4430: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4440: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
4450: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
4460: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
4470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4480: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4490: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
44a0: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
44b0: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
44c0: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
44d0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
44e0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
44f0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4500: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
4510: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
4520: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
4530: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
4540: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
4550: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
4560: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
4570: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4580: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
4590: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
45a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
45b0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
45c0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
45d0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
45e0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
45f0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4600: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
4610: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
4620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4630: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
4640: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
4650: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4660: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4680: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
4690: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
46a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
46b0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
46c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
46d0: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
46e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
46f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4700: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
4710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
4720: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
4730: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
4740: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4750: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
4760: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
4770: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
4780: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
4790: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
47a0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
47b0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
47c0: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
47d0: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
47e0: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
47f0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
4800: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
4810: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
4820: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
4830: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
4840: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4850: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4860: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
4870: 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72  **.** The db par
4880: 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e  ameter is option
4890: 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65  al.  It is neede
48a0: 64 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f  d if the Table o
48b0: 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  bject .** contai
48c0: 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ns lookaside mem
48d0: 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a  ory.  (Table obj
48e0: 65 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ects in the sche
48f0: 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a  ma do not use.**
4900: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4910: 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65  y, but some ephe
4920: 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
4930: 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65  cts do.)  Or the
4940: 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72  .** db parameter
4950: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
4960: 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  h db->pnBytesFre
4970: 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ed to measure th
4980: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64  e memory.** used
4990: 20 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62   by the Table ob
49a0: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
49b0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
49c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
49d0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
49e0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
49f0: 70 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c  pNext;.  TESTONL
4a00: 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  Y( int nLookasid
4a10: 65 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20  e; ) /* Used to 
4a20: 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65  verify lookaside
4a30: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63   not used for sc
4a40: 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  hema */..  asser
4a50: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
4a60: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
4a70: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
4a80: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
4a90: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
4aa0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
4ab0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
4ac0: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
4ad0: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
4ae0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4af0: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
4b00: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
4b10: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f  turn;..  /* Reco
4b20: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4b30: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4b40: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4b50: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4b60: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4b70: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4b80: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4b90: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4ba0: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4bb0: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4bc0: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4bd0: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4be0: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f  .  TESTONLY( nLo
4bf0: 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26  okaside = (db &&
4c00: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
4c10: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
4c20: 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  l)==0) ?.       
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c50: 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f  nOut : 0 );..  /
4c60: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
4c70: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
4c80: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
4c90: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
4ca0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
4cb0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
4cc0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
4cd0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
4ce0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
4cf0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4d00: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
4d10: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  a );.    if( !db
4d20: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4d30: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
4d40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4d50: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4d60: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4d70: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4d80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4d90: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4da0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4db0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4dc0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4dd0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4de0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4df0: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4e00: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4e10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4e20: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4e30: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4e40: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4e50: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4e60: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4e70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4e80: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4ea0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4eb0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4ec0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4ed0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4ee0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4ef0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4f00: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4f10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4f20: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4f30: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4f40: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4f50: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
4f60: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4f70: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
4f80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
4f90: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4fa0: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
4fb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fc0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4fd0: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
4fe0: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
4ff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5000: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5010: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5020: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5030: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
5040: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
5050: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5060: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5070: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5080: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
5090: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
50a0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
50b0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
50c0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
50d0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
50e0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
50f0: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
5100: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
5110: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
5120: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
5130: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5140: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
5150: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
5160: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
5170: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
5180: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
5190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
51a0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
51b0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
51c0: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
51d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
51e0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
51f0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
5200: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
5210: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
5220: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
5230: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
5240: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
5250: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
5260: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
5270: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
5280: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
5290: 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  bName, 0);.  sql
52a0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
52b0: 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c  db, p);.  db->fl
52c0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
52d0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
52e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
52f0: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
5300: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
5310: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
5320: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e  f that.** token.
5330: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
5340: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
5350: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
5360: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
5370: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
5380: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
5390: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
53a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71  ion..**.** Any q
53b0: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28  uotation marks (
53c0: 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61  ex:  "name", 'na
53d0: 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20  me', [name], or 
53e0: 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20  `name`) that.** 
53f0: 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64  surround the bod
5400: 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61  y of the token a
5410: 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a  re removed..**.*
5420: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
5430: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
5440: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
5450: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
5460: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
5470: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
5480: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
5490: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
54a0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
54b0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
54c0: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
54d0: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
54e0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
54f0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  n(sqlite3 *db, T
5500: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5510: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
5520: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
5530: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
5540: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
5550: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
5560: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
5570: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
5580: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
5590: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
55a0: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
55b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
55c0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
55d0: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
55e0: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
55f0: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
5600: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
5610: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
5620: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
5630: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
5640: 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c  rTable(Parse *p,
5650: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
5660: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
5670: 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69  tVdbe(p);.  sqli
5680: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  te3TableLock(p, 
5690: 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  iDb, MASTER_ROOT
56a0: 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  , 1, SCHEMA_TABL
56b0: 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74  E(iDb));.  sqlit
56c0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
56d0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
56e0: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
56f0: 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20   iDb, 5);.  if( 
5700: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
5710: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
5720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
5730: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
5740: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
5750: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
5760: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
5770: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
5780: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
5790: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
57a0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
57b0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
57c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
57d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
57e0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
57f0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
5800: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5810: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
5820: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
5830: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
5840: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
5850: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5860: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
5870: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5880: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
5890: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
58a0: 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20  *pDb;.    int n 
58b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
58c0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
58d0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
58e0: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
58f0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5900: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
5910: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
5920: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c  i!=1 ) && n==sql
5930: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
5940: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
5950: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
5960: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
5970: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
5980: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
59a0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
59b0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
59c0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
59d0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
59e0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
59f0: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
5a00: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5a10: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5a20: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
5a30: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
5a40: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5a50: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5a60: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
5a70: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
5a80: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
5a90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5aa0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
5ab0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5ac0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5af0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5b00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
5b30: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
5b40: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
5b50: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5b60: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5b70: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
5b80: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
5b90: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5ba0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
5bb0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
5bc0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
5bd0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
5be0: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
5bf0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5c00: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
5c10: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5c20: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5c30: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5c40: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5c50: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
5c60: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5c70: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
5c80: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5c90: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5ca0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5cb0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5cc0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
5cd0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5ce0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5cf0: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5d00: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
5d10: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5d20: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5d30: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d50: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
5d60: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
5d70: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5d80: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5d90: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
5da0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5db0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5dc0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
5dd0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
5de0: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
5df0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
5e00: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
5e10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5e20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
5e30: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5e40: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5e50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
5e60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
5e70: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
5e80: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
5e90: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
5ea0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
5eb0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
5ec0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
5ed0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
5ee0: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5ef0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5f00: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5f10: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f30: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5f40: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5f50: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5f60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5f70: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  b;..  assert( pN
5f80: 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28  ame2!=0 );.  if(
5f90: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5fa0: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5fb0: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5fc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5fd0: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5fe0: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5ff0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
6000: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
6010: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
6020: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
6030: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
6040: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
6050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6060: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6070: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
6080: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
6090: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
60a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
60b0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
60c0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
60d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
60e0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
60f0: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
6100: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
6110: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
6120: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6130: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
6140: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
6150: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
6160: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
6170: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
6180: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
6190: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
61a0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
61b0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
61c0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
61d0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
61e0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
61f0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
6200: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
6210: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
6220: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
6230: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
6240: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
6250: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
6260: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
6270: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
6280: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
6290: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
62a0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
62b0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
62c0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
62d0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
62e0: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
62f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6300: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
6310: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6320: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6330: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6340: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
6350: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6360: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
6370: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
6380: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
6390: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
63a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
63b0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
63c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
63d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
63e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
63f0: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6400: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6410: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6420: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
6430: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
6440: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
6450: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
6460: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
6470: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
6480: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
6490: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
64a0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
64b0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
64c0: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
64d0: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
64e0: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
64f0: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6500: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6510: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6520: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
6530: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
6540: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6550: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
6560: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
6570: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
6580: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
6590: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
65a0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
65b0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
65c0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
65d0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
65e0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
65f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
6600: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
6610: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
6620: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6630: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
6640: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
6650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6660: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
6670: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
6680: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
6690: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
66a0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
66b0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
66c0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
66d0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
66e0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
66f0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6700: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6710: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6720: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
6730: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
6740: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
6750: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
6760: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
6770: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
6780: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
6790: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
67a0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
67b0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
67c0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
67d0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
67e0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
67f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6800: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6810: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6820: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
6830: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
6840: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6850: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
6860: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
6870: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6880: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
6890: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
68a0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
68b0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
68c0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
68d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
68e0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
68f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6900: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6910: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6920: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
6930: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
6940: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
6950: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6960: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6970: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
6980: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6990: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
69a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
69b0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
69c0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
69d0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
69e0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
69f0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6a00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6a10: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6a20: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
6a30: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
6a40: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
6a50: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
6a60: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
6a70: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
6a80: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6a90: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6aa0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6ab0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6ac0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6ad0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6ae0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6af0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
6b00: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
6b10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6b20: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
6b30: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
6b40: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
6b50: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
6b60: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
6b70: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
6b80: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
6b90: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
6ba0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
6bb0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
6bc0: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
6bd0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6be0: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
6bf0: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
6c00: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
6c10: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6c20: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6c30: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
6c40: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
6c50: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
6c60: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
6c70: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
6c80: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
6c90: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6ca0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6cb0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
6cd0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6ce0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6cf0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
6d00: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
6d10: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
6d20: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6d30: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6d40: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6d50: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6d60: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
6d70: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6d80: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6d90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6da0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6db0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6dc0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6dd0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6de0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6df0: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
6e00: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6e10: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
6e20: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6e30: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6e40: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , pName);.  }.  
6e50: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6e60: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  en = *pName;.  i
6e70: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6e80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6e90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6ea0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6eb0: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6ec0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6ed0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6ee0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6ef0: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6f00: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6f10: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6f20: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6f30: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
6f40: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
6f50: 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
6f60: 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20   isView==1 );.  
6f70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
6f80: 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20  st u8 aCode[] = 
6f90: 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  {.       SQLITE_
6fa0: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20  CREATE_TABLE,.  
6fb0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6fc0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20  TE_TEMP_TABLE,. 
6fd0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
6fe0: 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20  ATE_VIEW,.      
6ff0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7000: 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a  EMP_VIEW.    };.
7010: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
7020: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7030: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
7040: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7050: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
7060: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
7070: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
7080: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7090: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
70a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
70b0: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
70c0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
70d0: 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f  pParse, (int)aCo
70e0: 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69  de[isTemp+2*isVi
70f0: 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ew],.           
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
7120: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
7130: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7140: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7150: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
7160: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
7170: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
7180: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
7190: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
71a0: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
71b0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
71c0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
71d0: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
71e0: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
71f0: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
7200: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
7210: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
7220: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
7230: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
7240: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
7250: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
7260: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
7270: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
7280: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
7290: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
72a0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
72b0: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
72c0: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
72d0: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
72e0: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
72f0: 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  AB ){.    char *
7300: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7310: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
7320: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7330: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
7340: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
7350: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7360: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7370: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7380: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
7390: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
73a0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
73b0: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
73c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
73d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
73e0: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
73f0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7400: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7420: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7430: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7450: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
7460: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
7470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
7480: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7490: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
74a0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
74b0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
74c0: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
74d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
74e0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
74f0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7500: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7510: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7520: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7530: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7540: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7550: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7560: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7570: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
7580: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
7590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
75a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
75b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
75c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
75d0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
75e0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
75f0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
7600: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
7610: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
7620: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
7630: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
7640: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
7650: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
7660: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7670: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7680: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7690: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
76a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
76b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
76c0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
76d0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
76e0: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
76f0: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
7700: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
7710: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
7720: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
7730: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
7740: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
7750: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7760: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7770: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7780: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7790: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
77a0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
77b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
77c0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
77d0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
77e0: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
77f0: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7800: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7810: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7820: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7830: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7840: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7850: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7860: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7870: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7880: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7890: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
78a0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
78b0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
78c0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
78d0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
78e0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
78f0: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7900: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7910: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7920: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7930: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7940: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7950: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7960: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7970: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7980: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7990: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
79a0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
79b0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
79c0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
79d0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
79e0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
79f0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7a00: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7a10: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7a20: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7a30: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7a40: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7a50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7a60: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7a70: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7a80: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7a90: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7aa0: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7ab0: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7ac0: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7ad0: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7ae0: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7af0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7b00: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7b10: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7b20: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7b30: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7b40: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7b50: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7b60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7b70: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7b80: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7ba0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7bb0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7bc0: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7bd0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7be0: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7bf0: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7c00: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7c10: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7c20: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7c30: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7c40: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7c50: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7c60: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7c70: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7c80: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7c90: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7cb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7cc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7cd0: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7ce0: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7cf0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7d00: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7d10: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7d20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7d30: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7d40: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7d50: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
7d60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
7d70: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
7d80: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
7d90: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
7da0: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
7db0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7dc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7dd0: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
7de0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7e00: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7e10: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
7e20: 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20  ORMAT, reg3);.  
7e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e40: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7e50: 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33  r, ENC(db), reg3
7e60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7e70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
7e80: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
7e90: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
7ea0: 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  NG, reg3);.    s
7eb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7ec0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
7ed0: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
7ee0: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
7ef0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
7f00: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
7f10: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
7f20: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
7f30: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
7f40: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
7f50: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
7f60: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
7f70: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
7f80: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
7f90: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
7fa0: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
7fb0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
7fc0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
7fd0: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  ry is left in re
7fe0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
7ff0: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20  egRowid..    ** 
8000: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
8010: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
8020: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e  table is left in
8030: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67   reg pParse->reg
8040: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  Root..    ** The
8050: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20   rowid and root 
8060: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
8070: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  es are needed by
8080: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20   the code that. 
8090: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64     ** sqlite3End
80a0: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72  Table will gener
80b0: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
80c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
80d0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
80e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
80f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
8100: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
8110: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
8120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8130: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8140: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
8150: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8160: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50  f.    {.      pP
8170: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
8180: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
8190: 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
81a0: 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32  Table, iDb, reg2
81b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
81c0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
81d0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ble(pParse, iDb)
81e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
81f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
8200: 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29  wRowid, 0, reg1)
8210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8220: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
8230: 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20  ob, 6, reg3, 0, 
8240: 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54  nullRow, P4_STAT
8250: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
8260: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8270: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33  _Insert, 0, reg3
8280: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8290: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
82a0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
82b0: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
82c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
82d0: 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Close);.  }..  /
82e0: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
82f0: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
8300: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
8310: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8320: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
8330: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
8340: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
8350: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
8360: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
8370: 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65  /* Set propertie
8380: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c  s of a table col
8390: 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65  umn based on the
83a0: 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61   (magical).** na
83b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
83c0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
83d0: 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f  ENABLE_HIDDEN_CO
83e0: 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74  LUMNS.void sqlit
83f0: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
8400: 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65  esFromName(Table
8410: 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a   *pTab, Column *
8420: 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  pCol){.  if( sql
8430: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43  ite3_strnicmp(pC
8440: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69  ol->zName, "__hi
8450: 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20  dden__", 10)==0 
8460: 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  ){.    pCol->col
8470: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
8480: 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65  _HIDDEN;.  }else
8490: 20 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f   if( pTab && pCo
84a0: 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26  l!=pTab->aCol &&
84b0: 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c   (pCol[-1].colFl
84c0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49  ags & COLFLAG_HI
84d0: 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61  DDEN) ){.    pTa
84e0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
84f0: 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d  F_OOOHidden;.  }
8500: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
8510: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
8520: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
8530: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
8540: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
8550: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
8560: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
8570: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
8580: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
8590: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
85a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
85b0: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
85c0: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
85d0: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
85e0: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
85f0: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
8600: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
8610: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
8620: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8630: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
8640: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8650: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
8660: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
8670: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
8680: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
86a0: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
86b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
86c0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
86d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
86e0: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e  OLUMN.  if( p->n
86f0: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
8700: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8710: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
8720: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8730: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8740: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
8750: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
8760: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
8770: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
8780: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8790: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
87a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
87b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
87c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
87d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
87e0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
87f0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8800: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8810: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
8820: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
8830: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
8840: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8850: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8860: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
8870: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
8880: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
8890: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
88a0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
88b0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
88c0: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
88d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
88e0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
88f0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
8900: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8910: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
8930: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
8940: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
8950: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
8960: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
8970: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8980: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
8990: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
89a0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
89b0: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
89c0: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
89d0: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
89e0: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
89f0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
8a00: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
8a10: 42 4c 4f 42 27 2e 20 49 66 20 74 68 65 72 65 20  BLOB'. If there 
8a20: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
8a30: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
8a40: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
8a50: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
8a60: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
8a70: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8a80: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
8a90: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8aa0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
8ab0: 4f 42 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  OB;.  pCol->szEs
8ac0: 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  t = 1;.  p->nCol
8ad0: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
8ae0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8af0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8b00: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8b10: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8b20: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8b30: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
8b40: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
8b50: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
8b60: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
8b70: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
8b80: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
8b90: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
8ba0: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
8bb0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8bc0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8bd0: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
8be0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8bf0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
8c00: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
8c10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8c20: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8c30: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8c40: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8c50: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8c60: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
8c70: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
8c80: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
8c90: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
8ca0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
8cb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
8cc0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
8cd0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
8ce0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8cf0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
8d00: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
8d10: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
8d20: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
8d30: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
8d40: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
8d50: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8d60: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
8d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
8d80: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
8d90: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
8da0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
8db0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
8dc0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
8dd0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
8de0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
8df0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
8e00: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
8e10: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
8e20: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
8e30: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
8e40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
8e50: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
8e60: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
8e90: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
8ea0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8eb0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
8ec0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8ed0: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
8ee0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8ef0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
8f00: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
8f10: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8f20: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
8f30: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
8f40: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
8f50: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8f60: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
8f70: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f80: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
8f90: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8fa0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
8fb0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
8fc0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
8fd0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
8fe0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
8ff0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9000: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9010: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9020: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9030: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
9040: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
9050: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
9060: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9070: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9080: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Char = 0;..  if(
9090: 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e   zIn==0 ) return
90a0: 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a   aff;.  while( z
90b0: 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d  In[0] ){.    h =
90c0: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
90d0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a  3UpperToLower[(*
90e0: 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20  zIn)&0xff];.    
90f0: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
9100: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
9110: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9120: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
9130: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
9140: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9150: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9160: 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20    zChar = zIn;. 
9170: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9180: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
9190: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
91a0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
91b0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
91c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
91d0: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
91e0: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
91f0: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
9200: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
9210: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
9220: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9230: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
9240: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
9250: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
9260: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
9270: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
9280: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
9290: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
92a0: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
92b0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
92c0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
92d0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
92e0: 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d      if( zIn[0]==
92f0: 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49  '(' ) zChar = zI
9300: 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
9310: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
9320: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
9330: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
9340: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
9350: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
9360: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
9370: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9380: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9390: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
93a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
93b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
93c0: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
93d0: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
93e0: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
93f0: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
9400: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9410: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9420: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9430: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9440: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9450: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
9460: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
9470: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
9480: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9490: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
94a0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
94b0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
94c0: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
94d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
94e0: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
94f0: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
9500: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
9510: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9520: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9530: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
9540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9550: 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e  * If pszEst is n
9560: 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61  ot NULL, store a
9570: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
9580: 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54  e field size.  T
9590: 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65  he.  ** estimate
95a0: 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68   is scaled so th
95b0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  at the size of a
95c0: 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20  n integer is 1. 
95d0: 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74   */.  if( pszEst
95e0: 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20   ){.    *pszEst 
95f0: 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c  = 1;   /* defaul
9600: 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78  t size is approx
9610: 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20   4 bytes */.    
9620: 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41  if( aff<SQLITE_A
9630: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9640: 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b      if( zChar ){
9650: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
9660: 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20  zChar[0] ){.    
9670: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9680: 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30  3Isdigit(zChar[0
9690: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
96a0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20    int v = 0;.   
96b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
96c0: 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20  GetInt32(zChar, 
96d0: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
96e0: 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20   v = v/4 + 1;.  
96f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
9700: 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20  255 ) v = 255;. 
9710: 20 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45             *pszE
9720: 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28  st = v; /* BLOB(
9730: 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20  k), VARCHAR(k), 
9740: 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f  CHAR(k) -> r=(k/
9750: 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  4+1) */.        
9760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9780: 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20   zChar++;.      
9790: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
97a0: 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74  .        *pszEst
97b0: 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c   = 5;   /* BLOB,
97c0: 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72   TEXT, CLOB -> r
97d0: 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62  =5  (approx 20 b
97e0: 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a  ytes)*/.      }.
97f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9800: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
9810: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9820: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
9830: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
9840: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
9850: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
9860: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9870: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
9880: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
9890: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
98a0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
98b0: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
98c0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
98d0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
98e0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
98f0: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
9900: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
9910: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
9920: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
9930: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
9940: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
9950: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
9960: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
9970: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
9980: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
9990: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
99a0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
99b0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
99c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
99d0: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
99e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
99f0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20  umn *pCol;..  p 
9a00: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9a10: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9a20: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
9a30: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
9a40: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
9a50: 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73  p->nCol-1];.  as
9a60: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70  sert( pCol->zTyp
9a70: 65 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  e==0 || CORRUPT_
9a80: 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  DB );.  sqlite3D
9a90: 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
9aa0: 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  , pCol->zType);.
9ab0: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9ac0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9ad0: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
9ae0: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
9af0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
9b00: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9b10: 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43  pCol->zType, &pC
9b20: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f  ol->szEst);.}../
9b30: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9b40: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9b50: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9b60: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9b70: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9b80: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9b90: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9ba0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9bb0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9bc0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9bd0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9be0: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9bf0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9c00: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9c10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9c20: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9c30: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9c40: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9c50: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9c60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9c70: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9c80: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9c90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9ca0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9cb0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9cc0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9cd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9ce0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9cf0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9d00: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9d10: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9d20: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9d30: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9d40: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9d50: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9d60: 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69  an->pExpr, db->i
9d70: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
9d80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9d90: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
9da0: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
9db0: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
9dc0: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
9dd0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
9de0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9df0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
9e00: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
9e10: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
9e20: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
9e30: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
9e40: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
9e50: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
9e60: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
9e70: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
9e80: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
9e90: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
9ea0: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
9eb0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9ec0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9ed0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
9ee0: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
9ef0: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
9f00: 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e  xprDup(db, pSpan
9f10: 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55 50  ->pExpr, EXPRDUP
9f20: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
9f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9f40: 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  , pCol->zDflt);.
9f50: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c        pCol->zDfl
9f60: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  t = sqlite3DbStr
9f70: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
9f80: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
9fc0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
9fd0: 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20  Start));.    }. 
9fe0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
9ff0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e  Delete(db, pSpan
a000: 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pExpr);.}../*.
a010: 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d  ** Backwards Com
a020: 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a  patibility Hack:
a030: 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63  .** .** Historic
a040: 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  al versions of S
a050: 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73  QLite accepted s
a060: 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e  trings as column
a070: 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64   names in.** ind
a080: 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59  exes and PRIMARY
a090: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
a0a0: 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63   and in UNIQUE c
a0b0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61  onstraints.  Exa
a0c0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
a0d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a  CREATE TABLE xyz
a0e0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41  (a,b,c,d,e,PRIMA
a0f0: 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51  RY KEY('a'),UNIQ
a100: 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41  UE('b','c' COLLA
a110: 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20  TE trim).**     
a120: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63  CREATE INDEX abc
a130: 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20   ON xyz('c','d' 
a140: 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45  DESC,'e' COLLATE
a150: 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a   nocase DESC);.*
a160: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f  *.** This is goo
a170: 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73  fy.  But to pres
a180: 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63  erve backwards c
a190: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20  ompatibility we 
a1a0: 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61  continue to.** a
a1b0: 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20  ccept it.  This 
a1c0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
a1d0: 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65   necessary conve
a1e0: 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65  rsion.  It conve
a1f0: 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  rts.** the expre
a200: 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69  ssion given in i
a210: 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d  ts argument from
a220: 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74   a TK_STRING int
a230: 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20  o a TK_ID.** if 
a240: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a250: 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49  s just a TK_STRI
a260: 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f  NG with an optio
a270: 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75  nal COLLATE clau
a280: 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70  se..** If the ep
a290: 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74  xression is anyt
a2a0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
a2b0: 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65  TK_STRING, the e
a2c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
a2d0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
a2e0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
a2f0: 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72  3StringToId(Expr
a300: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f   *p){.  if( p->o
a310: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a320: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49      p->op = TK_I
a330: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
a340: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
a350: 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   && p->pLeft->op
a360: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a370: 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20     p->pLeft->op 
a380: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a  = TK_ID;.  }.}..
a390: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
a3a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a3b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
a3c0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a3d0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
a3e0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
a3f0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
a400: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
a410: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
a420: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
a430: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
a440: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
a450: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
a460: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
a470: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
a480: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a490: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
a4a0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
a4b0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
a4c0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
a4d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
a4e0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
a4f0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
a500: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a510: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
a520: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
a530: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
a540: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
a550: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
a560: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
a570: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
a580: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
a590: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
a5a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
a5b0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
a5c0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
a5d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a5e0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
a5f0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
a600: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
a610: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
a620: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
a630: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
a640: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
a650: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
a660: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
a670: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
a680: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
a690: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
a6a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a6b0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
a6c0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
a6d0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a6e0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a6f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a700: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
a710: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
a720: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
a730: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
a740: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
a750: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
a760: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
a770: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
a780: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
a790: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
a7a0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
a7b0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
a7c0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
a7d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
a7e0: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
a7f0: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
a800: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
a810: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a820: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
a830: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
a840: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
a850: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
a860: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
a870: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
a880: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
a890: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
a8a0: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
a8b0: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
a8c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a8d0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
a8e0: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
a8f0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
a900: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
a910: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
a920: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
a930: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
a940: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
a950: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
a960: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
a970: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
a980: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
a990: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a9a0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a9b0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a9c0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a9d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a9e0: 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20      nTerm = 1;. 
a9f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72   }else{.    nTer
aa00: 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  m = pList->nExpr
aa10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
aa20: 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nTerm; i++){.  
aa30: 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
aa40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
aa50: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
aa60: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
aa70: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45 78      assert( pCEx
aa80: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  pr!=0 );.      s
aa90: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
aaa0: 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20  (pCExpr);.      
aab0: 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d  if( pCExpr->op==
aac0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
aad0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e   const char *zCN
aae0: 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e  ame = pCExpr->u.
aaf0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
ab00: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
ab10: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
ab20: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
ab30: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ab40: 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d  mp(zCName, pTab-
ab50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
ab60: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ab70: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
ab80: 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c  iCol].colFlags |
ab90: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
aba0: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  Y;.            z
abb0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
abc0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
abd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
abe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
abf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ac00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ac10: 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a  nTerm==1.   && z
ac20: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
ac30: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
ac40: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26  NTEGER")==0.   &
ac50: 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c  & sortOrder!=SQL
ac60: 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b  ITE_SO_DESC.  ){
ac70: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
ac80: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
ac90: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38  b->keyConf = (u8
aca0: 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73  )onError;.    as
acb0: 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30  sert( autoInc==0
acc0: 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29   || autoInc==1 )
acd0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
ace0: 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a  lags |= autoInc*
acf0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
ad00: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
ad10: 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  ) pParse->iPkSor
ad20: 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e  tOrder = pList->
ad30: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[0].sortOrder;.
ad40: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
ad50: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
ad60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
ad70: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
ad80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ad90: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
ada0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
adb0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
adc0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
add0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
ade0: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  f.  }else{.    I
adf0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
ae00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
ae10: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
ae20: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
ae30: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
ae60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   0);.    if( p )
ae70: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64 78 54 79  {.      p->idxTy
ae80: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54  pe = SQLITE_IDXT
ae90: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  YPE_PRIMARYKEY;.
aea0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
aeb0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
aec0: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
aed0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
aee0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
aef0: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
af00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
af10: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
af20: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
af30: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
af40: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
af50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af60: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
af70: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
af80: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
af90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
afa0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
afb0: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
afc0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
afd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
afe0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
aff0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b000: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
b010: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b020: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
b030: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
b040: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
b050: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
b060: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
b070: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
b080: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
b090: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
b0a0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b0b0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
b0c0: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
b0d0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
b0e0: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b0f0: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
b100: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
b110: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
b120: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
b130: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b140: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
b150: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
b160: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b170: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b180: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
b190: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
b1a0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
b1b0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
b1c0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
b1d0: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
b1e0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
b1f0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
b200: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
b210: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
b220: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
b230: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
b240: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
b250: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
b260: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
b270: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
b280: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
b290: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b2a0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
b2b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b2c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
b2d0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
b2e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b2f0: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
b300: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b310: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
b320: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
b330: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
b340: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
b350: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
b360: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
b370: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b380: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
b390: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
b3a0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
b3b0: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
b3c0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b3d0: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
b3e0: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
b3f0: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
b400: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
b410: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
b420: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
b430: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
b440: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
b450: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
b460: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
b470: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
b480: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
b490: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
b4a0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
b4b0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
b4c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b4d0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
b4e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
b4f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
b500: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
b510: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
b520: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b550: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b560: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
b570: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b580: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
b590: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b5a0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
b5b0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
b5c0: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
b5d0: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
b5e0: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
b5f0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
b600: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b610: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
b620: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
b630: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
b640: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
b650: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
b660: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
b670: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
b680: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
b690: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
b6a0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b6b0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
b6c0: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
b6d0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
b6e0: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
b6f0: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
b700: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
b710: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
b720: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
b730: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
b740: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
b750: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
b760: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
b770: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
b780: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
b790: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
b7a0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
b7b0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
b7c0: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
b7d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b7e0: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
b7f0: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
b800: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
b810: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b820: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
b830: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
b840: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
b850: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
b860: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
b870: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
b880: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
b890: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
b8a0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
b8b0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b8c0: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
b8d0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b8e0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
b8f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
b900: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
b910: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b920: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
b930: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
b940: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
b950: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
b960: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
b970: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
b980: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
b990: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
b9a0: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
b9b0: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
b9c0: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
b9d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
b9e0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
b9f0: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
ba00: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
ba10: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
ba20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ba30: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
ba40: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
ba50: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
ba60: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
ba70: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
ba80: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
ba90: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
baa0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
bab0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
bac0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
bad0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
bae0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
baf0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
bb00: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
bb10: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
bb20: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
bb30: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
bb40: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
bb50: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
bb60: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
bb70: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
bb80: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
bb90: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
bba0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
bbb0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
bbc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
bbd0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
bbe0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
bbf0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
bc00: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
bc10: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
bc20: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
bc30: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
bc40: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
bc50: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
bc60: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
bc70: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
bc80: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
bc90: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
bca0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
bcb0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
bcc0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
bcd0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
bce0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
bcf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
bd00: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
bd10: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
bd20: 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  Db){.  int r1 = 
bd30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
bd40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
bd50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bd60: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
bd70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd90: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
bda0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
bdb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
bdc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bdd0: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
bde0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
bdf0: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b  a_cookie+1, r1);
be00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
be10: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
be20: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
be30: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
be40: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
be50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
be60: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
be70: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
be80: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
be90: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
bea0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
beb0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
bec0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
bed0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
bee0: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
bef0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
bf00: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
bf10: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
bf20: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
bf30: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
bf40: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
bf50: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
bf60: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
bf70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
bf80: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
bf90: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
bfa0: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
bfb0: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
bfc0: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
bfd0: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
bfe0: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
bff0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
c000: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
c010: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70  inter to an outp
c020: 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73  ut buffer. The s
c030: 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  econd .** parame
c040: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
c050: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74   to an integer t
c060: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
c070: 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68   offset at.** wh
c080: 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ich to write int
c090: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
c0a0: 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
c0b0: 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a  on copies the.**
c0c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
c0d0: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
c0e0: 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70  o by the third p
c0f0: 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65  arameter, zSigne
c100: 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68  dIdent,.** to th
c110: 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73  e specified offs
c120: 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  et in the buffer
c130: 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49   and updates *pI
c140: 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74  dx to refer.** t
c150: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c160: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
c170: 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66  byte written bef
c180: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
c190: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72  * .** If the str
c1a0: 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  ing zSignedIdent
c1b0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
c1c0: 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65  ly of alpha-nume
c1d0: 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ric.** character
c1e0: 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  s, does not begi
c1f0: 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61  n with a digit a
c200: 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  nd is not an SQL
c210: 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65   keyword,.** the
c220: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  n it is copied t
c230: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
c240: 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69  fer exactly as i
c250: 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  t is. Otherwise,
c260: 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64  .** it is quoted
c270: 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75   using double-qu
c280: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
c290: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
c2a0: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
c2b0: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
c2c0: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
c2d0: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
c2e0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
c2f0: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
c300: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
c310: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
c320: 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  x;..  for(j=0; z
c330: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
c340: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
c350: 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  Isalnum(zIdent[j
c360: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
c370: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
c380: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
c390: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
c3a0: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
c3b0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
c3c0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
c3d0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20  nt, j)!=TK_ID.  
c3e0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64            || zId
c3f0: 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20  ent[j]!=0.      
c400: 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a        || j==0;..
c410: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c420: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c430: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
c440: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
c450: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
c460: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
c470: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
c480: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
c490: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
c4a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c4b0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
c4c0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
c4d0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
c4e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
c4f0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
c500: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
c510: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
c520: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
c530: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
c540: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
c550: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
c560: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
c570: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
c580: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
c590: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
c5a0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
c5b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
c5c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
c5d0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
c5e0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
c5f0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
c600: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
c610: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
c620: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
c630: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
c640: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
c650: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
c660: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
c670: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
c680: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
c690: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
c6a0: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
c6b0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
c6c0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
c6d0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
c6e0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
c6f0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
c700: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
c710: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
c720: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
c730: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
c740: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c750: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
c760: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
c770: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c780: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
c790: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c7a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
c7b0: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
c7c0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
c7d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
c7e0: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
c7f0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
c800: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
c810: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
c820: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
c830: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c840: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
c850: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c860: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
c870: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
c880: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c890: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c8a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c8b0: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
c8c0: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
c8d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c8e0: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
c8f0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c900: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
c910: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
c920: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
c930: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
c940: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
c950: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
c960: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
c970: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c980: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c990: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
c9a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c9b0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
c9c0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
c9d0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
c9e0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
c9f0: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
ca00: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
ca10: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ca20: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
ca30: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
ca40: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
ca50: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
ca60: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
ca70: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
ca80: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
ca90: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
caa0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cab0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cac0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
cad0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
cae0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
caf0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
cb00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
cb10: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cb20: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
cb30: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cb40: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cb50: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
cb60: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
cb70: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
cb80: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
cb90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
cba0: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
cbb0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
cbc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cbd0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cbe0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
cc00: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
cc10: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
cc20: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
cc30: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
cc40: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
cc50: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
cc60: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
cc70: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
cc80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cc90: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
cca0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
ccb0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
ccc0: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
ccd0: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
cce0: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
ccf0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
cd00: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
cd10: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
cd20: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
cd30: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
cd40: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
cd50: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
cd60: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
cd70: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
cd80: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
cd90: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
cda0: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
cdb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
cdc0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
cdd0: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
cde0: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
cdf0: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
ce00: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
ce10: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
ce20: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
ce30: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
ce40: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
ce50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ce60: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
ce70: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
ce80: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
ce90: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cea0: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  x->azColl = (con
ceb0: 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  st char**)zExtra
cec0: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
ced0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
cee0: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cef0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
cf00: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
cf10: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cf20: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
cf30: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
cf40: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cf50: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
cf60: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
cf70: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
cf80: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cf90: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
cfa0: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
cfb0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
cfc0: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
cfd0: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
cfe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cff0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d000: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
d010: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
d020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d030: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
d040: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
d050: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
d060: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
d070: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
d080: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d090: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
d0a0: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
d0b0: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
d0c0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
d0d0: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
d0e0: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
d0f0: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
d100: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
d110: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
d120: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
d130: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
d140: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
d150: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
d160: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
d170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d180: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
d190: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
d1a0: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
d1b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
d1c0: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
d1d0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
d1e0: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
d1f0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
d200: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
d210: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
d220: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
d230: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
d240: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
d250: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
d260: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
d270: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
d280: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
d290: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
d2a0: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
d2b0: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
d2c0: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
d2d0: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
d2e0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
d2f0: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
d300: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
d310: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
d320: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
d330: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
d340: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
d350: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
d360: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
d370: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
d380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d390: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
d3a0: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
d3b0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
d3c0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
d3d0: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
d3e0: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
d3f0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
d400: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
d410: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
d420: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
d430: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
d440: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
d450: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
d460: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
d470: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
d480: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d490: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d4a0: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
d4b0: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
d4c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d4d0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
d4e0: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
d4f0: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
d500: 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a  ex.  There is.**
d510: 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77            no row
d520: 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20 57  id btree for a W
d530: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49  ITHOUT ROWID.  I
d540: 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f  nstead, the cano
d550: 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  nical.**        
d560: 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20 69    data storage i
d570: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d580: 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20  ex btree..**    
d590: 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68 65   (2)  Bypass the
d5a0: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d5b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d5c0: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d5d0: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d5e0: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d5f0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d600: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d610: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d620: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d630: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d640: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d650: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d660: 33 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  3)  Set the Inde
d670: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d680: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d690: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d6a0: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d6b0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d6c0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d6d0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29  able..**     (4)
d6e0: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
d6f0: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
d700: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
d710: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
d720: 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41  L..**     (5)  A
d730: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
d740: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
d750: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
d760: 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ject.**         
d770: 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49   so that the PRI
d780: 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f  MARY KEY is a co
d790: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54  vering index.  T
d7a0: 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20  he surplus.**   
d7b0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61         columns a
d7c0: 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e  re part of KeyIn
d7d0: 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61  fo.nXField and a
d7e0: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
d7f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
d800: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
d810: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
d820: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
d830: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
d840: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
d850: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
d860: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
d870: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
d880: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
d890: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
d8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
d8b0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
d8c0: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
d8d0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d8e0: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
d8f0: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
d900: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
d910: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
d920: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d930: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
d940: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d950: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
d960: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
d970: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
d980: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
d990: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
d9a0: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
d9b0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d9c0: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
d9d0: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
d9e0: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
d9f0: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
da00: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
da10: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
da20: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
da30: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
da40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
da50: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
da60: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
da70: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
da80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
da90: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
daa0: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
dab0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
dac0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
dad0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
dae0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
daf0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
db00: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
db10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
db20: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
db30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
db40: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
db50: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74  Token;.    sqlit
db60: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b  e3TokenInit(&ipk
db70: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f  Token, pTab->aCo
db80: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
db90: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
dba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
dbb0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
dbc0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
dbd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dbe0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
dbf0: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29  D, &ipkToken, 0)
dc00: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
dc10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
dc20: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
dc30: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
dc40: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
dc50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
dc60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
dc70: 54 61 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d  Tab );.    pPk =
dc80: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
dc90: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
dca0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62  , 0, pList, pTab
dcb0: 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c  ->keyConf, 0, 0,
dcc0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
dcd0: 70 50 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pPk==0 ) return;
dce0: 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70  .    pPk->idxTyp
dcf0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59  e = SQLITE_IDXTY
dd00: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  PE_PRIMARYKEY;. 
dd10: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
dd20: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
dd30: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
dd40: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
dd50: 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79  Tab);..    /* By
dd60: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
dd70: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
dd80: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74   KEY btree and t
dd90: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
dda0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e  .    ** table en
ddb0: 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c  try. This is onl
ddc0: 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75  y required if cu
ddd0: 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69  rrently generati
dde0: 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63  ng VDBE.    ** c
ddf0: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
de00: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
de10: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
de20: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
de30: 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73      ** a databas
de40: 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20  e schema).  */. 
de50: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
de60: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
de70: 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
de80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
de90: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
dea0: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
deb0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
dec0: 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20  *.    ** Remove 
ded0: 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  all redundant co
dee0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50  lumns from the P
def0: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
df00: 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65   example, change
df10: 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59  .    ** "PRIMARY
df20: 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62   KEY(a,b,a,b,c,b
df30: 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74  ,c,d)" into just
df40: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
df50: 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a  b,c,d)".  Later.
df60: 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75      ** code assu
df70: 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  mes the PRIMARY 
df80: 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  KEY contains no 
df90: 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73  repeated columns
dfa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
dfb0: 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e  (i=j=1; i<pPk->n
dfc0: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
dfd0: 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
dfe0: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
dff0: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
e000: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
e010: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b   pPk->nColumn--;
e020: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e030: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
e040: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
e050: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
e060: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
e070: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
e080: 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f  .  }.  pPk->isCo
e090: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73  vering = 1;.  as
e0a0: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
e0b0: 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65    nPk = pPk->nKe
e0c0: 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  yCol;..  /* Make
e0d0: 20 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75   sure every colu
e0e0: 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  mn of the PRIMAR
e0f0: 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c  Y KEY is NOT NUL
e100: 4c 2e 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a  L.  (Except,.  *
e110: 2a 20 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65  * do not enforce
e120: 20 74 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74   this for impost
e130: 65 72 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20  er tables.) */. 
e140: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69   if( !db->init.i
e150: 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a  mposterTable ){.
e160: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e170: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
e180: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
e190: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74  aiColumn[i]].not
e1a0: 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  Null = OE_Abort;
e1b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e  .    }.    pPk->
e1c0: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  uniqNotNull = 1;
e1d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e1e0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
e1f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
e200: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
e210: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
e220: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
e230: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
e240: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
e250: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
e260: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
e270: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
e280: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
e290: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
e2a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
e2b0: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
e2c0: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
e2d0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e2e0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e2f0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e300: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
e310: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
e320: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
e330: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
e340: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
e350: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e360: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e370: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e380: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e390: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
e3a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
e3b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
e3c0: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
e3d0: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
e3e0: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
e3f0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
e400: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
e410: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
e420: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e430: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e440: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
e450: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
e460: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
e470: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
e480: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
e490: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
e4a0: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
e4b0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
e4c0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
e4d0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e4e0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
e4f0: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
e500: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
e510: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
e520: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
e530: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
e540: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e550: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
e560: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
e570: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
e580: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e590: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
e5a0: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
e5b0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
e5c0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
e5d0: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
e5e0: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
e5f0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
e600: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
e610: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
e620: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
e630: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
e640: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
e650: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
e660: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
e670: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
e680: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
e690: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
e6a0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
e6b0: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
e6c0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
e6d0: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
e6e0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
e6f0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
e700: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
e710: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
e720: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e730: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
e740: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
e750: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
e760: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  b->nCol;.  }.}..
e770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e780: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
e790: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
e7a0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
e7b0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
e7c0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e7d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
e7e0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
e7f0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
e800: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
e810: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
e820: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
e830: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
e840: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
e850: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
e860: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
e870: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
e880: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
e890: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
e8a0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
e8b0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
e8c0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
e8d0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
e8e0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
e8f0: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
e900: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
e910: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
e920: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
e930: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
e940: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
e950: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
e960: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
e970: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
e980: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
e990: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
e9a0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
e9b0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
e9c0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
e9d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
e9e0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
e9f0: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
ea00: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
ea10: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
ea20: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
ea30: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
ea40: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
ea50: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
ea60: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
ea70: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
ea80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
ea90: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
eaa0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
eab0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
eac0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ead0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
eae0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
eaf0: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
eb00: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
eb10: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
eb20: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
eb30: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
eb40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
eb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
eb60: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
eb70: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
eb80: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
eb90: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
eba0: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
ebb0: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
ebc0: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
ebd0: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
ebe0: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
ebf0: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
ec00: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
ec10: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
ec20: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
ec30: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
ec40: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
ec50: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
ec60: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
ec70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ec80: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
ec90: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
eca0: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
ecb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ecc0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
ecd0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
ece0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
ecf0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
ed00: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
ed10: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
ed20: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
ed30: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
ed40: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
ed50: 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
ed60: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
ed70: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
ed80: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
ed90: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
eda0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
edb0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
edc0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
edd0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
ede0: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
edf0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
ee00: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
ee10: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
ee20: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
ee30: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
ee40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
ee50: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
ee60: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
ee70: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
ee80: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
ee90: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
eea0: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
eeb0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
eec0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
eed0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
eee0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
eef0: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
ef00: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
ef10: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
ef20: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
ef30: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
ef40: 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e.).  **.  ** If
ef50: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
ef60: 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74  umber is 1, that
ef70: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74   means this is t
ef80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ef90: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65  .  ** table itse
efa0: 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20  lf.  So mark it 
efb0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a  read-only..  */.
efc0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
efd0: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
efe0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
eff0: 77 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70  wTnum;.    if( p
f000: 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74  ->tnum==1 ) p->t
f010: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65  abFlags |= TF_Re
f020: 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f  adonly;.  }..  /
f030: 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73  * Special proces
f040: 73 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54  sing for WITHOUT
f050: 20 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f   ROWID Tables */
f060: 0a 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26  .  if( tabOpts &
f070: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
f080: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f090: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
f0a0: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a  toincrement) ){.
f0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f0c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
f0d0: 20 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43          "AUTOINC
f0e0: 52 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77  REMENT not allow
f0f0: 65 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f  ed on WITHOUT RO
f100: 57 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  WID tables");.  
f110: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f120: 7d 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  }.    if( (p->ta
f130: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
f140: 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b  rimaryKey)==0 ){
f150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f160: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f170: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73  PRIMARY KEY miss
f180: 69 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22  ing on table %s"
f190: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
f1a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
f1b0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
f1c0: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54  WithoutRowid | T
f1d0: 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64  F_NoVisibleRowid
f1e0: 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54  ;.      convertT
f1f0: 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
f200: 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  le(pParse, p);. 
f210: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20     }.  }..  iDb 
f220: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
f230: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
f240: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
f250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
f260: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
f270: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
f280: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
f290: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
f2a0: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
f2b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
f2c0: 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
f2d0: 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
f2e0: 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
f2f0: 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
f300: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
f320: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69  K) */..  /* Esti
f330: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
f340: 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68   row size for th
f350: 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  e table and for 
f360: 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69  all implied indi
f370: 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74  ces */.  estimat
f380: 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a  eTableWidth(p);.
f390: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
f3a0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
f3b0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
f3c0: 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78     estimateIndex
f3d0: 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d  Width(pIdx);.  }
f3e0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
f3f0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
f400: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
f410: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
f420: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
f430: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
f440: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
f450: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
f460: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
f470: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
f480: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
f490: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
f4a0: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
f4b0: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
f4c0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
f4d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
f4e0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
f4f0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
f500: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
f510: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
f520: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
f530: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
f540: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
f550: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
f560: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
f570: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
f580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
f590: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
f5a0: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
f5b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f5c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
f5d0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
f5e0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
f5f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f600: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
f610: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
f620: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
f630: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
f640: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
f650: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
f660: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
f670: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
f680: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
f690: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
f6a0: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
f6b0: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
f6c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f6d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f6e0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
f6f0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
f700: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
f710: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
f720: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
f730: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
f740: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
f750: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
f760: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
f770: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f780: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f790: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
f7a0: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
f7b0: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
f7c0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
f7d0: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
f7e0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
f7f0: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
f800: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
f810: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
f820: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
f830: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
f840: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
f850: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
f860: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
f870: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
f880: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
f890: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
f8a0: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
f8b0: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
f8c0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
f8d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
f8e0: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
f8f0: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
f900: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
f910: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
f920: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
f930: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
f940: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
f950: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
f960: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
f970: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
f980: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
f990: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
f9a0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
f9b0: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
f9c0: 65 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20  est dest;    /* 
f9d0: 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54  Where the SELECT
f9e0: 20 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65   should store re
f9f0: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  sults */.      i
fa00: 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20  nt regYield;    
fa10: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
fa20: 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e  olding co-routin
fa30: 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f  e entry-point */
fa40: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
fa50: 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  op;        /* To
fa60: 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74  p of the co-rout
fa70: 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
fa80: 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
fa90: 20 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20   /* A record to 
faa0: 62 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  be insert into t
fab0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
fac0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77        int regRow
fad0: 69 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  id;       /* Row
fae0: 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72  id of the next r
faf0: 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  ow to insert */.
fb00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e        int addrIn
fb10: 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70  sLoop;    /* Top
fb20: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
fb30: 20 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20   inserting rows 
fb40: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
fb50: 70 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20  pSelTab;     /* 
fb60: 41 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73  A table that des
fb70: 63 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43  cribes the SELEC
fb80: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  T results */..  
fb90: 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b      regYield = +
fba0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
fbb0: 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b       regRec = ++
fbc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
fbd0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b      regRowid = +
fbe0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
fbf0: 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
fc00: 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
fc10: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
fc20: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
fc30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fc40: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
fc50: 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
fc60: 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
fc70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc80: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
fc90: 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20  LAG_P2ISREG);.  
fca0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
fcb0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72   = 2;.      addr
fcc0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
fcd0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
fce0: 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
fcf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fd00: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
fd10: 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61  , regYield, 0, a
fd20: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73  ddrTop);.      s
fd30: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
fd40: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
fd50: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
fd60: 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eld);.      sqli
fd70: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fd80: 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
fd90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fda0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fdb0: 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
fdc0: 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  egYield);.      
fdd0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fde0: 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d  ere(v, addrTop -
fdf0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
fe00: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
fe10: 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c  turn;.      pSel
fe20: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
fe30: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
fe40: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
fe50: 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54  .      if( pSelT
fe60: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
fe70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fe80: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
fe90: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
fea0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
feb0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
fec0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
fed0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
fee0: 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
fef0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
ff00: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
ff10: 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
ff20: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73  );.      addrIns
ff30: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
ff40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
ff50: 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
ff60: 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rm);.      VdbeC
ff70: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ff80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff90: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
ffa0: 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74  cord, dest.iSdst
ffb0: 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65  , dest.nSdst, re
ffc0: 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  gRec);.      sql
ffd0: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
ffe0: 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  y(v, p, 0);.    
fff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10000 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
10010 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  id, 1, regRowid)
10020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10030 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10040 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65  Insert, 1, regRe
10050 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
10060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
10070 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  oto(v, addrInsLo
10080 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
10090 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
100a0 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
100b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
100c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
100d0 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a  ose, 1);.    }..
100e0 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
100f0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
10100 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
10110 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
10120 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
10130 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
10140 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
10150 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
10160 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
10170 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
10180 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
10190 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
101a0 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
101b0 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
101c0 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
101d0 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
101e0 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
101f0 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
10200 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
10210 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
10220 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
10230 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
10240 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
10250 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
10260 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
10270 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
10280 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
10290 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
102a0 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
102b0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
102c0 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
102d0 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
102e0 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
102f0 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
10300 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
10310 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
10320 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10330 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
10340 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
10350 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
10360 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
10370 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
10380 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
10390 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
103a0 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
103b0 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
103c0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
103d0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
103e0 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
103f0 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
10400 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
10410 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
10420 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
10430 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
10440 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
10450 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10460 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
10470 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10480 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10490 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
104a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
104b0 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
104c0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
104d0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
104e0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
104f0 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
10500 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
10510 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
10520 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
10530 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
10540 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
10550 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
10560 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10570 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
10580 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10590 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
105a0 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
105b0 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
105c0 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
105d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
105e0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
105f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
10600 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
10610 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
10620 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
10630 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
10640 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
10650 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
10660 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
10670 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
10680 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
10690 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
106a0 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
106b0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
106c0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
106d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
106e0 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
106f0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
10700 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
10710 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
10720 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
10730 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
10740 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
10750 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
10760 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
10770 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
10780 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
10790 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
107a0 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
107b0 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
107c0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
107d0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
107e0 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
107f0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
10800 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
10810 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
10820 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
10830 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
10840 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
10850 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
10860 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
10870 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
10880 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
10890 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
108a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
108b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
108c0 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
108d0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
108e0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
108f0 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
10900 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
10910 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
10920 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
10930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
10940 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
10950 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
10960 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
10970 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
10980 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
10990 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
109a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
109b0 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
109c0 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
109d0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
109e0 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
109f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
10a00 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
10a10 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
10a20 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
10a30 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
10a40 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
10a50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
10a60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10a70 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
10a80 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
10a90 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
10aa0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
10ab0 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
10ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
10ad0 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
10ae0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
10af0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
10b00 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
10b10 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
10b20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
10b30 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
10b40 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
10b50 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
10b60 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
10b70 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
10b80 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
10b90 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
10ba0 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
10bb0 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
10bc0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10bd0 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
10be0 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
10bf0 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
10c00 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
10c10 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
10c20 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
10c30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10c40 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
10c50 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
10c60 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
10c70 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
10c80 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
10c90 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
10ca0 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
10cb0 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
10cc0 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
10cd0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
10ce0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
10cf0 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
10d00 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
10d10 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
10d20 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
10d30 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
10d40 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
10d50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10d60 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
10d70 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
10d80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10d90 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
10da0 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
10db0 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
10dc0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
10dd0 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
10de0 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
10df0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
10e00 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
10e10 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
10e20 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
10e30 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
10e40 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
10e50 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
10e60 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
10e70 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
10e80 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
10e90 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
10ea0 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
10eb0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
10ec0 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
10ed0 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
10ee0 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
10ef0 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
10f00 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
10f10 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
10f20 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
10f30 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
10f40 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
10f50 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
10f60 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
10f70 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
10f80 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
10f90 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
10fa0 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
10fb0 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
10fc0 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
10fd0 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
10fe0 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
10ff0 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
11000 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
11010 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
11020 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
11030 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
11040 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
11050 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
11060 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
11070 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
11080 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
11090 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
110a0 29 3b 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d  );.  p->pCheck =
110b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
110c0 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c  Dup(db, pCNames,
110d0 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
110e0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
110f0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
11100 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11110 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
11120 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
11130 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
11140 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
11150 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
11160 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
11170 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
11180 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  stToken;.  asser
11190 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  t( sEnd.z[0]!=0 
111a0 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  );.  if( sEnd.z[
111b0 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
111c0 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
111d0 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
111e0 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
111f0 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
11200 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  z);.  assert( n>
11210 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69  0 );.  z = pBegi
11220 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73  n->z;.  while( s
11230 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
11240 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
11250 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
11260 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
11270 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
11280 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
11290 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
112a0 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
112b0 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
112c0 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
112d0 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
112e0 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76  0, 0);..create_v
112f0 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69  iew_fail:.  sqli
11300 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
11310 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
11320 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11330 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
11340 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
11350 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11360 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
11370 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
11380 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
11390 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
113a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
113b0 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
113c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
113d0 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
113e0 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
113f0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
11400 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11410 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
11420 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
11430 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
11440 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
11450 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
11460 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
11470 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
11480 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
11490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
114a0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
114b0 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
114c0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
114d0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
114e0 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
114f0 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
11500 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
11510 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
11520 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
11530 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
11540 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
11550 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
11560 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
11570 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11580 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
11590 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
115a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
115b0 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
115c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
115d0 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
115e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
115f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
11600 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11610 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
11620 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c   errors */.  sql
11630 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68  ite3_xauth xAuth
11640 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
11650 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a   xAuth pointer *
11660 2f 0a 20 20 75 38 20 62 45 6e 61 62 6c 65 64 4c  /.  u8 bEnabledL
11670 41 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  A;             /
11680 2a 20 53 61 76 65 64 20 64 62 2d 3e 6c 6f 6f 6b  * Saved db->look
11690 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 73  aside.bEnabled s
116a0 74 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tate */..  asser
116b0 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
116c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
116d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
116e0 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
116f0 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
11700 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20  se, pTable) ){. 
11710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11720 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
11730 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
11740 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
11750 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
11760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11770 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
11780 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
11790 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
117a0 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
117b0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
117c0 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
117d0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
117e0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
117f0 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
11800 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
11810 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
11820 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
11830 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
11840 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
11850 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
11860 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
11870 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
11880 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
11890 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
118a0 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
118b0 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
118c0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
118d0 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
118e0 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
118f0 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
11900 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
11910 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
11920 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
11930 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
11940 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
11950 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
11960 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
11970 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
11980 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
11990 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
119a0 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
119b0 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
119c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
119d0 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
119e0 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
119f0 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
11a00 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
11a10 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
11a20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
11a30 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
11a40 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
11a50 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
11a60 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
11a70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11a80 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
11a90 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
11aa0 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
11ab0 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
11ac0 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
11ad0 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
11ae0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
11af0 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
11b00 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
11b10 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
11b20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
11b30 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
11b40 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
11b50 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
11b60 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
11b70 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
11b80 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
11b90 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
11ba0 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
11bb0 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
11bc0 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
11bd0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
11be0 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
11bf0 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
11c00 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
11c10 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
11c20 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
11c30 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
11c40 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
11c50 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
11c60 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
11c70 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
11c80 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
11c90 65 6c 65 63 74 20 29 3b 0a 20 20 62 45 6e 61 62  elect );.  bEnab
11ca0 6c 65 64 4c 41 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  ledLA = db->look
11cb0 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a  aside.bEnabled;.
11cc0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
11cd0 68 65 63 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  heck ){.    db->
11ce0 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
11cf0 65 64 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ed = 0;.    sqli
11d00 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
11d10 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
11d20 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a  Table->pCheck, .
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
11d50 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70  pTable->nCol, &p
11d60 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
11d70 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 20  }else{.    pSel 
11d80 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
11d90 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
11da0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
11db0 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
11dc0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
11dd0 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
11de0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
11df0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
11e00 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20  el->pSrc);.     
11e10 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
11e20 2d 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f  -1;.      db->lo
11e30 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
11e40 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
11e50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
11e60 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 78 41  IZATION.      xA
11e70 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
11e80 0a 20 20 20 20 20 20 64 62 2d 3e 78 41 75 74 68  .      db->xAuth
11e90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
11ea0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
11eb0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
11ec0 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
11ed0 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
11ee0 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
11ef0 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
11f00 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11f10 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11f20 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  el);.#endif.    
11f30 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
11f40 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   n;.      if( pS
11f50 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  elTab ){.       
11f60 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11f70 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
11f80 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
11f90 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
11fa0 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65  ;.        pTable
11fb0 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
11fc0 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
11fd0 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
11fe0 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
11ff0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12000 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
12010 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
12020 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 61  lTab);.        a
12030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
12040 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
12050 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63  , 0, pTable->pSc
12060 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 7d  hema) );.      }
12070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
12080 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
12090 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
120a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
120b0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
120c0 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  e(db, pSel);.   
120d0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
120e0 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
120f0 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
12100 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 62 45 6e  e.bEnabled = bEn
12110 61 62 6c 65 64 4c 41 3b 0a 20 20 70 54 61 62 6c  abledLA;.  pTabl
12120 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
12130 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
12140 72 65 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64  resetViews;.#end
12150 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12160 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
12170 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
12180 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
12190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
121a0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
121b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
121c0 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
121d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
121e0 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
121f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
12200 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
12210 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
12220 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
12230 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
12240 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
12250 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
12260 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
12270 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
12280 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
12290 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
122a0 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
122b0 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
122c0 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
122d0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
122e0 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
122f0 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
12300 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
12310 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
12320 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
12330 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
12340 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
12350 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
12360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12370 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
12380 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
12390 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
123a0 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
123b0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
123c0 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
123d0 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
123e0 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
123f0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
12400 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
12410 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
12420 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12430 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
12440 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12450 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
12460 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
12470 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
12480 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
12490 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
124a0 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
124b0 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
124c0 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
124d0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
124e0 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
124f0 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
12500 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
12510 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
12520 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
12530 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
12540 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
12550 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
12560 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
12570 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
12580 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
12590 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
125a0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
125b0 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
125c0 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
125d0 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
125e0 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
125f0 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
12600 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
12610 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12620 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
12630 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
12640 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
12650 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
12660 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
12670 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
12680 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
12690 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
126a0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
126b0 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
126c0 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
126d0 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
126e0 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
126f0 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
12700 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
12710 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
12720 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
12730 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
12740 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
12750 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
12760 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
12770 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
12780 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
12790 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
127a0 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
127b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
127c0 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
127d0 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
127e0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
127f0 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
12800 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
12810 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
12820 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
12830 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
12840 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
12850 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
12860 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
12870 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
12880 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
12890 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
128a0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
128b0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
128c0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
128d0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
128e0 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
128f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
12900 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
12910 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
12920 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
12930 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
12940 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
12950 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
12960 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
12970 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
12980 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
12990 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
129a0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
129b0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
129c0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
129d0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
129e0 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
129f0 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
12a00 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
12a10 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
12a20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
12a30 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
12a40 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
12a50 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
12a60 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
12a70 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
12a80 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
12a90 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
12aa0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
12ab0 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
12ac0 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
12ad0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
12ae0 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
12af0 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
12b00 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
12b10 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
12b20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
12b30 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
12b40 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
12b50 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
12b60 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12b70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12b80 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
12b90 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
12ba0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12bb0 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
12bc0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
12bd0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12be0 20 61 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e   assert( iTable>
12bf0 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  1 );.  sqlite3Vd
12c00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
12c10 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
12c20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  r1, iDb);.  sqli
12c30 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
12c40 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
12c50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12c60 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
12c70 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
12c80 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
12c90 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
12ca0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
12cb0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
12cc0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
12cd0 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
12ce0 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
12cf0 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
12d00 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
12d10 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
12d20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
12d30 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
12d40 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
12d50 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
12d60 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
12d70 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
12d80 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
12d90 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
12da0 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
12db0 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61   grammar rules a
12dc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12dd0 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  he TK_REGISTER. 
12de0 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64   ** token for ad
12df0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12e00 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  tion..  */.  sql
12e10 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
12e20 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
12e30 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
12e40 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
12e50 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
12e60 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
12e70 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
12e80 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
12e90 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
12ea0 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
12eb0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
12ec0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
12ed0 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
12ee0 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
12ef0 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
12f00 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
12f10 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
12f20 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
12f30 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
12f40 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12f50 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
12f60 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
12f70 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
12f80 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
12f90 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
12fa0 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
12fb0 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
12fc0 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
12fd0 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
12fe0 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
12ff0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
13000 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
13010 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
13020 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13030 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
13040 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13050 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
13060 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
13070 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13080 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
13090 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
130a0 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f  chema);.  destro
130b0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
130c0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44  , pTab->tnum, iD
130d0 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
130e0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
130f0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
13100 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
13110 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
13120 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
13130 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
13140 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
13150 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
13160 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
13170 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13180 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
13190 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
131a0 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
131b0 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
131c0 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
131d0 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
131e0 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
131f0 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
13200 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
13210 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
13220 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
13230 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
13240 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
13250 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
13260 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
13270 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
13280 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
13290 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
132a0 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
132b0 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
132c0 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
132d0 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
132e0 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
132f0 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
13300 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
13310 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
13320 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
13330 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
13340 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
13350 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
13360 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
13370 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
13380 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
13390 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
133a0 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
133b0 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
133c0 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
133d0 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
133e0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
133f0 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
13400 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
13410 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
13420 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
13430 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
13440 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
13450 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
13460 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
13470 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
13480 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
13490 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
134a0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
134b0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
134c0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
134d0 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
134e0 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
134f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
13500 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
13510 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
13520 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
13530 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
13540 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
13550 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
13560 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
13570 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
13580 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
13590 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
135a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
135b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
135c0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
135d0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
135e0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
135f0 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ema);.      asse
13600 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
13610 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44  b<pParse->db->nD
13620 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  b );.      destr
13630 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
13640 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
13650 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
13660 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
13670 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
13690 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
136a0 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
136b0 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
136c0 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
136d0 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
136e0 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
136f0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
13700 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
13710 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
13720 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13730 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13740 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13750 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
13760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13770 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
13780 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13790 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
137a0 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
137b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137c0 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
137d0 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
137e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
137f0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
13800 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
13810 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
13820 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31  zName;.  for(i=1
13830 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=4; i++){.  
13840 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b    char zTab[24];
13850 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
13860 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61  rintf(sizeof(zTa
13870 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f  b),zTab,"sqlite_
13880 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20  stat%d",i);.    
13890 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
138a0 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
138b0 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20   zTab, zDbName) 
138c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
138d0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
138e0 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
138f0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
13900 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20  HERE %s=%Q",.   
13910 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54       zDbName, zT
13920 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65  ab, zType, zName
13930 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
13940 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
13950 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72  erate code to dr
13960 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  op a table..*/.v
13970 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44  oid sqlite3CodeD
13980 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
13990 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
139a0 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  Tab, int iDb, in
139b0 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62  t isView){.  Vdb
139c0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
139d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
139e0 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  ;.  Trigger *pTr
139f0 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62  igger;.  Db *pDb
13a00 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
13a10 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
13a20 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13a30 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
13a50 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
13a60 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
13a70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13a80 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13a90 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
13aa0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ac0 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
13ad0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
13ae0 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
13af0 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
13b00 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
13b10 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
13b20 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61  e.  ** is genera
13b30 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
13b40 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
13b50 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
13b60 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
13b70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
13b80 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69  red..  */.  pTri
13b90 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
13ba0 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65  iggerList(pParse
13bb0 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65  , pTab);.  while
13bc0 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
13bd0 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
13be0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
13bf0 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
13c00 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
13c10 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
13c20 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
13c30 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
13c40 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
13c50 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
13c60 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
13c70 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  gger->pNext;.  }
13c80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13c90 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
13ca0 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
13cb0 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
13cc0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
13cd0 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
13ce0 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ted with.  ** th
13cf0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
13d00 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
13d10 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
13d20 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
13d30 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
13d40 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
13d50 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
13d60 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
13d70 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73   to.  ** move as
13d80 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
13d90 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
13da0 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
13db0 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   mode)..  */.  i
13dc0 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
13dd0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
13de0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
13df0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13e00 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45  Parse,.      "DE
13e10 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
13e20 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
13e30 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
13e40 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
13e50 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
13e60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13e70 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
13e80 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
13e90 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
13ea0 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
13eb0 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
13ec0 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
13ed0 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
13ee0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
13ef0 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
13f00 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
13f10 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13f20 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
13f30 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
13f40 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
13f50 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
13f60 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
13f70 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
13f80 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
13f90 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
13fa0 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
13fb0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
13fc0 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
13fd0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
13fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
13ff0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
14000 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14010 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14020 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
14030 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
14040 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
14050 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
14060 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
14070 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69  me);.  if( !isVi
14080 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
14090 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65  (pTab) ){.    de
140a0 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
140b0 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  e, pTab);.  }.. 
140c0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
140d0 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
140e0 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
140f0 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
14100 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
14110 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f  ema cookie..  */
14120 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14130 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
14140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14150 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20  v, OP_VDestroy, 
14160 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
14170 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
14180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14190 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
141a0 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
141b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
141c0 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
141d0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
141e0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
141f0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
14200 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
14210 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14220 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
14230 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
14240 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
14250 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
14260 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
14270 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
14280 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
14290 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
142a0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
142b0 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
142c0 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
142d0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
142e0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
142f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14300 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
14310 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14320 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
14330 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14340 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
14350 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
14360 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14370 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
14380 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
14390 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
143a0 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
143b0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
143c0 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
143d0 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61  ressErr++;.  pTa
143e0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
143f0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
14400 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d  e, isView, &pNam
14410 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20  e->a[0]);.  if( 
14420 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
14430 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66  ressErr--;..  if
14440 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
14450 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c   if( noErr ) sql
14460 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
14470 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
14480 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
14490 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f  atabase);.    go
144a0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
144b0 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
144c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
144d0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
144e0 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
144f0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
14500 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
14510 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
14520 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
14530 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
14540 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
14550 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
14560 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
14570 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14580 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
14590 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
145a0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
145b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
145c0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
145d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
145e0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
145f0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
14600 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
14610 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
14620 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
14630 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14640 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
14650 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
14660 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d  st char *zArg2 =
14670 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
14680 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14690 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
146a0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
146b0 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  )){.      goto e
146c0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
146d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
146e0 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
146f0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
14700 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
14710 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14720 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57  E_DROP_TEMP_VIEW
14730 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14740 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
14750 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a  LITE_DROP_VIEW;.
14760 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
14770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14780 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c  UALTABLE.    }el
14790 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
147a0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
147b0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
147c0 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20  OP_VTABLE;.     
147d0 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33   zArg2 = sqlite3
147e0 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54  GetVTable(db, pT
147f0 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65  ab)->pMod->zName
14800 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
14810 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
14820 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
14830 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
14840 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
14850 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
14860 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14870 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
14880 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
14890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
148a0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
148b0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
148c0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
148d0 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20  zArg2, zDb) ){. 
148e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
148f0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
14900 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14910 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14920 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
14930 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
14940 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14950 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14960 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
14970 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
14980 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
14990 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
149a0 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26  _", 7)==0 .    &
149b0 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
149c0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
149d0 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31  sqlite_stat", 11
149e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
149f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14a00 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
14a10 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
14a20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14a30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
14a40 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
14a50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14a60 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
14a70 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
14a80 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
14a90 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
14aa0 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
14ab0 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
14ac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
14ad0 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14ae0 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
14af0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14b00 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
14b10 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
14b20 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
14b30 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
14b40 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14b50 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
14b60 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
14b70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
14b80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14b90 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
14ba0 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
14bb0 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
14bc0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
14bd0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14be0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14bf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14c00 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
14c10 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
14c20 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
14c30 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
14c40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14c50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14c60 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
14c70 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
14c80 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
14c90 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
14ca0 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
14cb0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
14cc0 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
14cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b  );.    sqlite3Fk
14ce0 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
14cf0 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a  , pName, pTab);.
14d00 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
14d10 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
14d20 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
14d30 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
14d40 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
14d50 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
14d60 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
14d70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14d80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
14d90 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
14da0 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
14db0 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
14dc0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
14dd0 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
14de0 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
14df0 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
14e00 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
14e10 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
14e20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
14e30 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
14e40 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
14e50 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
14e60 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
14e70 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
14e80 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
14e90 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28  le referred to (
14ea0 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e  a.k.a the "paren
14eb0 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43  t" table).  pToC
14ec0 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20  ol is a list.** 
14ed0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
14ee0 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c   parent pTo tabl
14ef0 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  e.  flags contai
14f00 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
14f10 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
14f20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
14f30 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
14f40 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
14f50 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
14f60 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
14f70 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
14f80 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
14f90 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
14fa0 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
14fb0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
14fc0 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
14fd0 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
14fe0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
14ff0 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  e field..**.** T
15000 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
15010 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
15020 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
15030 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
15040 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
15050 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15060 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
15070 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
15080 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15090 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
150a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
150b0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
150c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
150d0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
150e0 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
150f0 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
15100 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
15110 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
15120 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
15130 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15140 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
15150 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
15160 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
15170 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
15180 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
15190 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
151a0 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
151b0 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
151c0 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  s. */.){.  sqlit
151d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
151e0 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
151f0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
15200 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
15210 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a  ey = 0;.  FKey *
15220 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65  pNextTo;.  Table
15230 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
15240 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
15250 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
15260 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
15270 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
15280 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
15290 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c   p==0 || IN_DECL
152a0 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
152b0 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
152c0 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
152d0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
152e0 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e  Col-1;.    if( N
152f0 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67  EVER(iCol<0) ) g
15300 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15310 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
15320 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
15330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15340 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15350 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
15360 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
15370 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
15380 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
15390 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
153a0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
153b0 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
153c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
153d0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
153e0 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
153f0 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15400 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
15410 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
15420 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15430 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
15440 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
15450 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
15460 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
15470 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
15480 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
15490 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
154a0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
154b0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
154c0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
154d0 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
154e0 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
154f0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
15500 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  Key) + (nCol-1)*
15510 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
15520 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
15530 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
15540 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
15550 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
15560 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
15570 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
15580 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
15590 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
155a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
155b0 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
155c0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
155d0 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
155e0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  y==0 ){.    goto
155f0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70   fk_end;.  }.  p
15600 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
15610 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
15620 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
15630 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
15640 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b  Key->aCol[nCol];
15650 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
15660 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
15670 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
15680 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
15690 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
156a0 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f  e(z);.  z += pTo
156b0 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
156c0 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
156d0 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
156e0 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
156f0 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
15700 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
15710 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15720 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15730 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
15740 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
15750 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
15760 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
15770 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
15780 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
15790 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
157a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
157b0 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
157c0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
157d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
157e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
157f0 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
15800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15810 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15820 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
15830 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
15840 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
15850 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
15860 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
15870 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
15880 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
15890 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
158a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
158b0 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
158c0 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
158d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
158e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
158f0 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
15900 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
15910 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
15920 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
15930 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
15940 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
15950 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
15960 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
15970 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
15980 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
15990 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
159a0 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73  [0] = (u8)(flags
159b0 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20   & 0xff);       
159c0 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54       /* ON DELET
159d0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46  E action */.  pF
159e0 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20  Key->aAction[1] 
159f0 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e  = (u8)((flags >>
15a00 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20   8 ) & 0xff);   
15a10 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63   /* ON UPDATE ac
15a20 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tion */..  asser
15a30 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
15a40 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
15a50 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a   p->pSchema) );.
15a60 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65    pNextTo = (FKe
15a70 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49  y *)sqlite3HashI
15a80 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
15a90 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20  a->fkeyHash, .  
15aa0 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20      pFKey->zTo, 
15ab0 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
15ac0 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
15ad0 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64  ==pFKey ){.    d
15ae0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15af0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  = 1;.    goto fk
15b00 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
15b10 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
15b20 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
15b30 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
15b40 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
15b50 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
15b60 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
15b70 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
15b80 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
15b90 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
15ba0 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
15bb0 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
15bc0 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
15bd0 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
15be0 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
15bf0 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
15c00 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
15c10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15c20 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
15c30 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
15c40 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
15c50 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
15c60 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
15c70 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
15c80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15c90 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
15ca0 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
15cb0 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
15cc0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
15cd0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
15ce0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
15cf0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
15d00 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
15d10 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
15d20 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
15d30 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
15d40 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
15d50 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
15d60 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
15d70 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
15d80 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
15d90 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
15da0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
15db0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
15dc0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
15dd0 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
15de0 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
15df0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15e00 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15e10 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
15e20 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
15e30 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
15e40 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
15e50 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
15e60 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
15e70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
15e80 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
15e90 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
15ea0 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
15eb0 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
15ec0 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
15ed0 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
15ee0 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
15ef0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
15f00 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
15f10 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
15f20 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
15f30 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
15f40 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
15f50 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
15f60 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
15f70 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
15f80 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
15f90 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
15fa0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
15fb0 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
15fc0 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
15fd0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
15fe0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
15ff0 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
16000 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
16010 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
16020 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
16030 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
16040 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
16050 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
16060 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
16070 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
16080 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
16090 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
160a0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
160b0 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
160c0 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
160d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
160e0 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
160f0 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
16100 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
16110 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
16120 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
16130 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
16140 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
16150 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
16160 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
16170 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
16180 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
16190 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
161a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
161b0 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
161c0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
161d0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
161e0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
161f0 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
16200 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
16210 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
16220 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20  t iSorter;      
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16240 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79  Cursor opened by
16250 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20   OpenSorter (if 
16260 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  in use) */.  int
16270 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
16280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16290 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
162a0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
162b0 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
162c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
162d0 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
162e0 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
162f0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  on */.  int tnum
16300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16310 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
16320 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
16330 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61    int iPartIdxLa
16340 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
16350 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73   /* Jump to this
16360 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61   label to skip a
16370 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a   row */.  Vdbe *
16380 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
163a0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
163b0 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
163c0 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
163d0 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
163e0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
163f0 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
16400 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
16430 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69  ding assembled i
16440 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
16450 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16460 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
16470 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
16480 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
16490 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
164a0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
164b0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
164c0 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
164d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
164e0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
164f0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
16500 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
16510 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
16520 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
16530 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16540 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
16550 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
16560 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
16570 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16580 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
16590 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
165a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
165b0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
165c0 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
165d0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
165e0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
165f0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16600 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
16610 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
16620 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
16630 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
16640 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
16650 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
16660 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
16670 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
16680 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
16690 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20   pIndex);..  /* 
166a0 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20  Open the sorter 
166b0 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65  cursor if we are
166c0 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a   to use one. */.
166d0 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72    iSorter = pPar
166e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71  se->nTab++;.  sq
166f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16700 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
16710 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49  , iSorter, 0, pI
16720 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28  ndex->nKeyCol, (
16730 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20  char*).         
16740 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16750 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
16760 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  y), P4_KEYINFO);
16770 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
16780 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f  table. Loop thro
16790 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  ugh all rows of 
167a0 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72  the table, inser
167b0 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20  ting index.  ** 
167c0 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65  records into the
167d0 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71   sorter. */.  sq
167e0 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
167f0 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
16800 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
16810 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
16820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16830 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
16840 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f  iTab, 0); VdbeCo
16850 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67  verage(v);.  reg
16860 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
16870 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
16880 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
16890 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
168a0 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61  Parse,pIndex,iTa
168b0 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69  b,regRecord,0,&i
168c0 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30  PartIdxLabel,0,0
168d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
168e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
168f0 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74  terInsert, iSort
16900 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
16910 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
16920 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
16930 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
16940 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
16950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16960 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
16970 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
16980 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
16990 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
169a0 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
169b0 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
169c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
169d0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
169e0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
169f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16a00 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
16a10 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
16a40 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16a50 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16a60 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
16a70 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
16a80 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
16a90 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
16aa0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
16ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16ac0 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
16ad0 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  er, 0); VdbeCove
16ae0 72 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72  rage(v);.  asser
16af0 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62  t( pKey!=0 || db
16b00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
16b10 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
16b20 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
16b30 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 26 26  Index(pIndex) &&
16b40 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20   pKey!=0 ){.    
16b50 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
16b60 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16b70 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69  v) + 3;.    sqli
16b80 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a  te3VdbeGoto(v, j
16b90 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  2);.    addr2 = 
16ba0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
16bb0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
16bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16bd0 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Int(v, OP_Sorter
16be0 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72  Compare, iSorter
16bf0 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c  , j2, regRecord,
16c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c10 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
16c20 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
16c30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16c40 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
16c50 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
16c60 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65   OE_Abort, pInde
16c70 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
16c80 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
16c90 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16ca0 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
16cb0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16cc0 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53  P_SorterData, iS
16cd0 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64  orter, regRecord
16ce0 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
16cf0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16d00 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20 30  OP_Last, iIdx, 0
16d10 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , -1);.  sqlite3
16d20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16d30 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
16d40 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b  , regRecord, 0);
16d50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
16d60 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
16d70 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
16d80 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
16d90 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16da0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
16db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16dc0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
16dd0 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72  t, iSorter, addr
16de0 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
16df0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
16e00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16e10 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  dr1);..  sqlite3
16e20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16e30 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
16e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16e50 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
16e60 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
16e70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16e80 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29  _Close, iSorter)
16e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
16ea0 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74  ate heap space t
16eb0 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20  o hold an Index 
16ec0 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c  object with nCol
16ed0 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
16ee0 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  Increase the all
16ef0 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20  ocation size to 
16f00 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61  provide an extra
16f10 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
16f20 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
16f30 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ed space after t
16f40 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
16f50 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20  and return a.** 
16f60 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
16f70 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a  extra space in *
16f80 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65  ppExtra..*/.Inde
16f90 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61  x *sqlite3Alloca
16fa0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20  teIndexObject(. 
16fb0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
16fc0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16fd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16fe0 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20    i16 nCol,     
16ff0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
17000 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
17010 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
17020 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
17030 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17040 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65  er of bytes of e
17050 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c  xtra space to al
17060 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  loc */.  char **
17070 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a  ppExtra       /*
17080 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
17090 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f  "extra" space */
170a0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20  .){.  Index *p; 
170b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
170c0 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62  located index ob
170d0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ject */.  int nB
170e0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  yte;           /
170f0 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
17100 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63   for Index objec
17110 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20  t + arrays */.. 
17120 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
17130 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b  sizeof(Index)) +
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17150 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
17160 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
17170 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
17180 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20  r*)*nCol) +     
17190 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
171a0 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
171b0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
171c0 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
171d0 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64  +1) +     /* Ind
171e0 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20  ex.aiRowLogEst  
171f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17200 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29       sizeof(i16)
17210 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
17220 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
17230 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20  lumn   */.      
17240 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
17250 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20  f(u8)*nCol);    
17260 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17270 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
17280 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
17290 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
172a0 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  yte + nExtra);. 
172b0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68   if( p ){.    ch
172c0 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63  ar *pExtra = ((c
172d0 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73  har*)p)+ROUND8(s
172e0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
172f0 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28     p->azColl = (
17300 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78  const char**)pEx
17310 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52  tra; pExtra += R
17320 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
17330 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70  r*)*nCol);.    p
17340 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20  ->aiRowLogEst = 
17350 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b  (LogEst*)pExtra;
17360 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   pExtra += sizeo
17370 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
17380 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c  1);.    p->aiCol
17390 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74  umn = (i16*)pExt
173a0 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
173b0 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
173c0 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f  nCol;.    p->aSo
173d0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70  rtOrder = (u8*)p
173e0 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43  Extra;.    p->nC
173f0 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20  olumn = nCol;.  
17400 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e    p->nKeyCol = n
17410 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70  Col - 1;.    *pp
17420 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
17430 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  p) + nByte;.  }.
17440 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
17450 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
17460 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
17470 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
17480 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
17490 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
174a0 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
174b0 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
174c0 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
174d0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
174e0 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
174f0 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
17500 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
17510 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
17520 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
17530 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
17540 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
17550 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
17560 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
17570 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17580 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
17590 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
175a0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
175b0 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
175c0 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
175d0 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
175e0 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
175f0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
17600 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
17610 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
17620 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
17630 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
17640 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
17650 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
17660 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
17670 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
17680 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
17690 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
176a0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
176b0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
176c0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ion.  .**.** If 
176d0 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72 65  the index is cre
176e0 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ated successfull
176f0 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  y, return a poin
17700 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49  ter to the new I
17710 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72  ndex.** structur
17720 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
17730 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  by sqlite3AddPri
17740 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72  maryKey() to mar
17750 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  k the index.** a
17760 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72 69  s the tables pri
17770 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e  mary key (Index.
17780 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  idxType==SQLITE_
17790 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
177a0 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  EY).*/.Index *sq
177b0 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
177c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
177d0 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
177e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
177f0 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
17800 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
17810 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
17820 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
17830 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
17840 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
17850 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
17860 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
17870 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
17880 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
17890 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
178a0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
178b0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
178c0 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
178d0 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
178e0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
178f0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
17900 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
17910 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
17920 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
17930 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
17940 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
17950 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
17960 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
17970 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
17980 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
17990 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
179a0 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
179b0 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
179c0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
179d0 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
179e0 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
179f0 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
17a00 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
17a10 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
17a20 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
17a30 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
17a40 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
17a50 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74  ){.  Index *pRet
17a60 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69   = 0;     /* Poi
17a70 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  nter to return *
17a80 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
17a90 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
17aa0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
17ab0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
17ac0 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
17ad0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
17ae0 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
17af0 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
17b00 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
17b10 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
17b20 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
17b30 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
17b40 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
17b50 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
17b60 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
17b70 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
17b80 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
17b90 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
17ba0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
17bb0 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
17bc0 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
17bd0 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
17be0 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
17bf0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17c00 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
17c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17c20 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
17c30 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
17c40 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
17c50 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
17c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17c70 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
17c80 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
17c90 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
17ca0 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
17cb0 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
17cc0 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
17cd0 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
17ce0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
17cf0 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
17d00 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
17d10 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
17d20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
17d30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17d40 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
17d50 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
17d60 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
17d70 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
17d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17d90 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
17da0 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
17db0 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
17dc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17dd0 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
17de0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
17df0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
17e00 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
17e10 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
17e20 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
17e30 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
17e40 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  */..  if( db->ma
17e50 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
17e60 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 7c 7c  _DECLARE_VTAB ||
17e70 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
17e80 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17e90 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17ea0 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
17eb0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
17ec0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
17ed0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
17ee0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
17ef0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
17f00 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
17f10 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
17f20 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
17f30 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
17f40 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
17f50 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
17f60 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
17f70 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
17f80 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
17f90 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
17fa0 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
17fb0 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
17fc0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
17fd0 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
17fe0 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
17ff0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
18000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
18010 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
18020 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
18030 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
18040 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
18050 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
18060 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
18070 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
18090 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61  rt( pName && pNa
180a0 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65  me->z );..#ifnde
180b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
180c0 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
180d0 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
180e0 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
180f0 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c  heck if the tabl
18100 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
18110 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
18120 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
18130 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64  e to 1. Do not d
18140 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66  o this.    ** if
18150 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20   initialising a 
18160 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
18170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18180 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18190 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  {.      pTab = s
181a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
181b0 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
181c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
181d0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
181e0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
181f0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
18200 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
18210 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
18220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
18230 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  dif..    sqlite3
18240 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
18250 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64  Parse, iDb, "ind
18260 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ex", pName);.   
18270 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
18280 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54  rcList(&sFix, pT
18290 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  blName) ){.     
182a0 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
182b0 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
182c0 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
182d0 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
182e0 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
182f0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
18300 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
18310 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
18320 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
18330 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
18340 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
18350 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65  se, 0, &pTblName
18360 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73  ->a[0]);.    ass
18370 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
18380 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62  ailed==0 || pTab
18390 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
183a0 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
183b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
183c0 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20  .    if( iDb==1 
183d0 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  && db->aDb[iDb].
183e0 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70  pSchema!=pTab->p
183f0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
18400 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18410 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
18420 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61      "cannot crea
18430 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20  te a TEMP index 
18440 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c  on non-TEMP tabl
18450 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20  e \"%s\"",.     
18460 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
18470 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
18480 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
184a0 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
184b0 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50  ) pPk = sqlite3P
184c0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
184d0 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Tab);.  }else{. 
184e0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
184f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
18500 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a  t( pStart==0 );.
18510 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
18520 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
18530 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
18540 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18550 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20  ndex;.    iDb = 
18560 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
18570 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
18580 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70  Schema);.  }.  p
18590 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
185a0 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  b];..  assert( p
185b0 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Tab!=0 );.  asse
185c0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
185d0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==0 );.  if( sql
185e0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
185f0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
18600 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
18610 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62     && db->init.b
18620 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54  usy==0.#if SQLIT
18630 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
18640 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20  ATION.       && 
18650 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
18660 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  able(pTab->zName
18670 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20  )==0.#endif.    
18680 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
18690 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  NICmp(&pTab->zNa
186a0 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f  me[7],"altertab_
186b0 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  ",9)!=0 ){.    s
186c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
186d0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
186e0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
186f0 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
18700 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
18710 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18720 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
18730 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
18740 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
18750 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
18760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18770 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
18780 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
18790 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
187a0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
187b0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
187c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
187d0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
187e0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
187f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18800 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
18810 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
18820 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
18830 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18840 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18850 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
18860 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
18870 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
18880 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
18890 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
188a0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
188b0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
188c0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
188d0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
188e0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
188f0 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
18900 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
18910 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
18920 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
18930 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
18940 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
18950 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
18960 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
18970 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
18980 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
18990 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
189a0 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
189b0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
189c0 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
189d0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
189e0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
189f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
18a00 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
18a10 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
18a20 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
18a30 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
18a40 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
18a50 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
18a60 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
18a70 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
18a80 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
18a90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
18aa0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
18ab0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
18ac0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
18ad0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18ae0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
18af0 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20  pName->z!=0 );. 
18b00 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
18b10 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
18b20 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
18b30 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
18b40 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18b50 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18b60 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
18b70 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69  .busy ){.      i
18b80 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
18b90 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30  ble(db, zName, 0
18ba0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18bb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18bc0 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
18bd0 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
18be0 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
18bf0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
18c00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18c10 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
18c20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
18c30 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
18c40 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d  zName, pDb->zNam
18c50 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)!=0 ){.      i
18c60 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
18c70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18c80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18c90 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
18ca0 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
18cb0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
18cc0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
18cd0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
18cf0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
18d00 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
18d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18d20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18d30 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18d40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
18d50 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
18d60 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
18d70 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
18d80 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
18d90 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
18da0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65  n++){}.    zName
18db0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
18dc0 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75  f(db, "sqlite_au
18dd0 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20  toindex_%s_%d", 
18de0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b  pTab->zName, n);
18df0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
18e00 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
18e10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18e20 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
18e30 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
18e40 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
18e50 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
18e60 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
18e70 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
18e80 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
18e90 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
18ea0 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  pDb->zName;.    
18eb0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18ec0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
18ed0 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
18ee0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
18ef0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
18f00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18f10 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18f20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
18f30 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
18f40 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
18f50 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
18f60 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
18f70 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
18f80 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18f90 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
18fa0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
18fb0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
18fc0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18fd0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18fe0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
18ff0 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
19000 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
19010 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
19020 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
19030 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
19040 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
19050 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
19060 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
19070 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
19080 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
19090 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
190a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
190b0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f  ist==0 ){.    To
190c0 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20  ken prevCol;.   
190d0 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
190e0 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54 61 62  t(&prevCol, pTab
190f0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
19100 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l-1].zName);.   
19110 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
19120 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
19130 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
19140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19150 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
19160 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
19170 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
19180 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
19190 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
191a0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
191b0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
191c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
191d0 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
191e0 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a  st, sortOrder);.
191f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
19200 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
19210 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
19220 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
19230 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
19240 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
19250 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
19260 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
19270 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
19280 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
19290 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
192a0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
192b0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
192c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
192d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
192e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
192f0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
19300 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  Expr!=0 );.    i
19310 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
19320 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
19330 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
19340 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
19350 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
19360 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
19370 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
19380 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
19390 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
193a0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
193b0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
193c0 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50    nExtraCol = pP
193d0 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k ? pPk->nKeyCol
193e0 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d   : 1;.  pIndex =
193f0 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
19400 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
19410 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
19420 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
19460 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
19470 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
19480 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
19490 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
194a0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
194b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
194c0 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
194d0 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
194e0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
194f0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
19500 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
19510 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
19520 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
19530 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
19540 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
19550 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
19560 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
19570 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
19580 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
19590 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
195a0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
195b0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
195c0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
195d0 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
195e0 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49 54   = pName ? SQLIT
195f0 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
19600 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50   : SQLITE_IDXTYP
19610 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e 64  E_UNIQUE;.  pInd
19620 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
19630 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
19640 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b  ma;.  pIndex->nK
19650 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e  eyCol = pList->n
19660 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57  Expr;.  if( pPIW
19670 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
19680 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
19690 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
196a0 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78  pTab, NC_PartIdx
196b0 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a  , pPIWhere, 0);.
196c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72      pIndex->pPar
196d0 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57  tIdxWhere = pPIW
196e0 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65  here;.    pPIWhe
196f0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  re = 0;.  }.  as
19700 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
19710 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
19720 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f   iDb, 0) );..  /
19730 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
19740 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f  f we should hono
19750 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20  r DESC requests 
19760 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  on index columns
19770 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d  .  */.  if( pDb-
19780 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
19790 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
197a0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
197b0 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44  -1;   /* Honor D
197c0 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ESC */.  }else{.
197d0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
197e0 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e  k = 0;    /* Ign
197f0 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a  ore DESC */.  }.
19800 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68  .  /* Analyze th
19810 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
19820 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  sions that form 
19830 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
19840 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20   index and.  ** 
19850 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72  report any error
19860 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f  s.  In the commo
19870 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
19880 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
19890 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61  xactly.  ** a ta
198a0 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72  ble column, stor
198b0 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e  e that column in
198c0 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f   aiColumn[].  Fo
198d0 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73  r general expres
198e0 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75  sions,.  ** popu
198f0 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f  late pIndex->aCo
19900 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  lExpr and store 
19910 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20  XN_EXPR (-2) in 
19920 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a  aiColumn[]..  **
19930 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
19940 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
19950 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  wo or more colum
19960 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
19970 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20  are identical.. 
19980 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20   ** TODO: Issue 
19990 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65  a warning if the
199a0 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b   table primary k
199b0 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ey is used as pa
199c0 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69  rt of the.  ** i
199d0 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20  ndex key..  */. 
199e0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49   for(i=0, pListI
199f0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
19a00 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
19a10 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b  +, pListItem++){
19a20 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70  .    Expr *pCExp
19a30 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
19a40 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
19a50 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
19a60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75   */.    int requ
19a70 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20  estedSortOrder; 
19a80 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72         /* ASC or
19a90 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74   DESC on the i-t
19aa0 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  h expression */.
19ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19ac0 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
19ad0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
19ae0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
19af0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ..    sqlite3Str
19b00 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65  ingToId(pListIte
19b10 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73  m->pExpr);.    s
19b20 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
19b30 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
19b40 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45  e, pTab, NC_IdxE
19b50 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e  xpr, pListItem->
19b60 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69  pExpr, 0);.    i
19b70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
19b80 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19b90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43  te_index;.    pC
19ba0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
19bb0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
19bc0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  istItem->pExpr);
19bd0 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d  .    if( pCExpr-
19be0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
19bf0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  {.      if( pTab
19c00 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
19c10 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
19c20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
19c30 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69  Parse, "expressi
19c40 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ons prohibited i
19c50 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  n PRIMARY KEY an
19c60 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  d ".            
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73      "UNIQUE cons
19c90 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20  traints");.     
19ca0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19cb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
19cc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e   }.      if( pIn
19cd0 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30  dex->aColExpr==0
19ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
19cf0 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73 71  List *pCopy = sq
19d00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
19d10 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a  (db, pList, 0);.
19d20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
19d30 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70 79  aColExpr = pCopy
19d40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 64  ;.        if( !d
19d50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
19d70 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29 3b  ert( pCopy!=0 );
19d80 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73 74  .          pList
19d90 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61  Item = &pCopy->a
19da0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
19db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d       }.      j =
19dc0 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
19dd0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19de0 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20  [i] = XN_EXPR;. 
19df0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
19e00 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
19e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
19e20 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75   = pCExpr->iColu
19e30 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mn;.      assert
19e40 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20  ( j<=0x7fff );. 
19e50 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a       if( j<0 ){.
19e60 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62          j = pTab
19e70 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d  ->iPKey;.      }
19e80 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61  else if( pTab->a
19e90 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
19ea0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
19eb0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
19ec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19ed0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
19ee0 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a  lumn[i] = (i16)j
19ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c  ;.    }.    zCol
19f00 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  l = 0;.    if( p
19f10 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
19f20 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
19f30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  ){.      int nCo
19f40 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  ll;.      zColl 
19f50 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  = pListItem->pEx
19f60 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
19f70 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69      nColl = sqli
19f80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
19f90 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73  l) + 1;.      as
19fa0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43  sert( nExtra>=nC
19fb0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  oll );.      mem
19fc0 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c  cpy(zExtra, zCol
19fd0 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  l, nColl);.     
19fe0 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b   zColl = zExtra;
19ff0 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
1a000 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45   nColl;.      nE
1a010 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra -= nColl;. 
1a020 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d     }else if( j>=
1a030 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  0 ){.      zColl
1a040 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1a050 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .zColl;.    }.  
1a060 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a    if( !zColl ) z
1a070 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1a080 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28  rBINARY;.    if(
1a090 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1a0a0 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
1a0b0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1a0c0 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
1a0d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a0e0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1a0f0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1a100 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
1a110 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
1a120 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
1a130 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
1a140 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
1a150 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1a160 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
1a170 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
1a180 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
1a190 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20  d the table key 
1a1a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a1b0 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49  e index.  For WI
1a1c0 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a  THOUT ROWID.  **
1a1d0 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50   tables (when pP
1a1e0 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20  k!=0) this will 
1a1f0 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  be the declared 
1a200 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
1a210 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61  r.  ** normal ta
1a220 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d  bles (when pPk==
1a230 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  0) this will be 
1a240 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a  the rowid..  */.
1a250 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20    if( pPk ){.   
1a260 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d   for(j=0; j<pPk-
1a270 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
1a280 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
1a290 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  k->aiColumn[j];.
1a2a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e        assert( x>
1a2b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1a2c0 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
1a2d0 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64  ->aiColumn, pInd
1a2e0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20  ex->nKeyCol, x) 
1a2f0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1a300 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20  x->nColumn--; . 
1a310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a320 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
1a330 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20  lumn[i] = x;.   
1a340 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43       pIndex->azC
1a350 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[i] = pPk->az
1a360 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
1a370 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1a380 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53  der[i] = pPk->aS
1a390 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
1a3a0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1a3b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a3c0 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e  rt( i==pIndex->n
1a3d0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73  Column );.  }els
1a3e0 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  e{.    pIndex->a
1a3f0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
1a400 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65  ROWID;.    pInde
1a410 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73  x->azColl[i] = s
1a420 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1a430 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1a440 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
1a450 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  ex);.  if( pPars
1a460 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
1a470 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  ) estimateIndexW
1a480 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20  idth(pIndex);.. 
1a490 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
1a4a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
1a4b0 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
1a4c0 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
1a4d0 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
1a4e0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1a4f0 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
1a500 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
1a510 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1a520 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
1a530 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
1a540 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
1a550 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1a560 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
1a570 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
1a580 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
1a590 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
1a5a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
1a5b0 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
1a5c0 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
1a5d0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1a5e0 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
1a5f0 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
1a600 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
1a610 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
1a620 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
1a630 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
1a640 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
1a650 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
1a660 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
1a670 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
1a680 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
1a690 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1a6a0 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
1a6b0 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
1a6c0 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
1a6d0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
1a6e0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
1a6f0 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
1a700 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1a710 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
1a720 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
1a730 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
1a740 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
1a750 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
1a760 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
1a770 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
1a780 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
1a790 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
1a7a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1a7b0 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
1a7c0 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
1a7d0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
1a7e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
1a7f0 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
1a800 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
1a810 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
1a820 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
1a830 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
1a840 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
1a850 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
1a860 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
1a870 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
1a880 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1a890 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1a8a0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
1a8b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
1a8c0 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
1a8d0 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
1a8e0 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61  pIdx) );.      a
1a8f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78  ssert( pIdx->idx
1a900 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1a910 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20  TYPE_APPDEF );. 
1a920 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
1a930 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
1a940 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  x) );..      if(
1a950 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d   pIdx->nKeyCol!=
1a960 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1a970 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1a980 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64    for(k=0; k<pId
1a990 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29  x->nKeyCol; k++)
1a9a0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1a9b0 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20  char *z1;.      
1a9c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
1a9d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1a9e0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1a9f0 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [k]>=0 );.      
1aa00 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
1aa10 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
1aa20 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
1aa30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
1aa40 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
1aa50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
1aa60 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1aa70 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
1aa80 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65  z1!=z2 && sqlite
1aa90 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1aaa0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1aab0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
1aac0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
1aad0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1aae0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
1aaf0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
1ab00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1ab10 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
1ab20 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
1ab30 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
1ab40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1ab50 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
1ab60 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
1ab70 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
1ab80 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1ab90 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
1aba0 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
1abb0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
1abc0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
1abd0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
1abe0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
1abf0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
1ac00 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
1ac10 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
1ac20 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
1ac30 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1ac40 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
1ac50 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
1ac60 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
1ac70 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
1ac80 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
1ac90 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1aca0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1acb0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1acc0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1acd0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
1ace0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1acf0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
1ad00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ad10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1ad20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ad30 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
1ad40 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1ad50 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
1ad60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ad70 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1ad80 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1ad90 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
1ada0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
1adb0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
1adc0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1add0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1ade0 20 20 20 20 70 52 65 74 20 3d 20 70 49 64 78 3b      pRet = pIdx;
1adf0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1ae00 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1ae10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ae20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
1ae30 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
1ae40 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
1ae50 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
1ae60 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
1ae70 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
1ae80 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
1ae90 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1aea0 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
1aeb0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
1aec0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
1aed0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1aee0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1aef0 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
1af00 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
1af10 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1af20 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
1af30 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
1af40 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
1af60 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  ndex->zName, pIn
1af70 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
1af80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1af90 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
1afa0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
1afb0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
1afc0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
1afd0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
1afe0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1aff0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1b000 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
1b010 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
1b020 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
1b030 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1b040 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1b050 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1b060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b070 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b080 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20   initial CREATE 
1b090 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1b0a0 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  (or CREATE TABLE
1b0b0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   if the.  ** ind
1b0c0 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1b0d0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1b0e0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1b0f0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1b100 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f  hen.  ** emit co
1b110 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1b120 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1b130 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1b140 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1b150 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1b160 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1b170 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1b180 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1b190 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65   with.  ** conte
1b1a0 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1b1b0 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1b1c0 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1b1d0 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1b1e0 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74  ter.  ** table t
1b1f0 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
1b200 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
1b210 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
1b220 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
1b230 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  ** of a WITHOUT 
1b240 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a  ROWID table..  *
1b250 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
1b260 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
1b270 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
1b280 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70  erated as an imp
1b290 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  lied PRIMARY KEY
1b2a0 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
1b2b0 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1b2c0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1b2d0 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1b2e0 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
1b2f0 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1b300 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1b310 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1b320 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1b330 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
1b340 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
1b350 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f    else if( HasRo
1b360 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62  wid(pTab) || pTb
1b370 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1b380 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
1b390 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
1b3a0 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
1b3b0 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
1b3c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1b3d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
1b3e0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
1b3f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b400 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
1b410 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1b420 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1b430 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
1b440 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
1b450 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  r the index usin
1b460 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42  g CreateIndex. B
1b470 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ut before.    **
1b480 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20   doing so, code 
1b490 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69  a Noop instructi
1b4a0 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73  on and store its
1b4b0 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20   address in .   
1b4c0 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20   ** Index.tnum. 
1b4d0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
1b4e0 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e   in case this in
1b4f0 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20  dex is actually 
1b500 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52  a .    ** PRIMAR
1b510 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61  Y KEY and the ta
1b520 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ble is actually 
1b530 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1b540 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a  table. In .    *
1b550 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  * that case the 
1b560 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
1b570 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75  RowidTable() rou
1b580 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63  tine will replac
1b590 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f  e.    ** the Noo
1b5a0 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f  p with a Goto to
1b5b0 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56   jump over the V
1b5c0 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74  DBE code generat
1b5d0 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ed below. */.   
1b5e0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1b5f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b600 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
1b610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b620 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
1b630 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65  eIndex, iDb, iMe
1b640 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  m);..    /* Gath
1b650 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
1b660 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
1b670 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1b680 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
1b690 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1b6a0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
1b6b0 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1b6c0 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70   int n = (int)(p
1b6d0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1b6e0 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20  n.z - pName->z) 
1b6f0 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  + pParse->sLastT
1b700 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66  oken.n;.      if
1b710 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d  ( pName->z[n-1]=
1b720 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20  =';' ) n--;.    
1b730 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
1b740 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
1b750 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
1b760 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1b770 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
1b780 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1b790 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
1b7a0 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
1b7b0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1b7c0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1b7d0 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1b7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b7f0 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
1b800 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
1b810 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1b820 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1b830 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
1b840 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1b850 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
1b860 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
1b870 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
1b880 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
1b890 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
1b8a0 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
1b8b0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
1b8c0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1b8d0 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
1b8e0 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1b8f0 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1b900 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1b910 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1b920 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
1b930 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
1b940 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1b950 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
1b960 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1b970 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
1b980 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
1b990 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1b9a0 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
1b9b0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
1b9c0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
1b9d0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
1b9e0 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
1b9f0 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
1ba00 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
1ba10 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
1ba20 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
1ba30 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
1ba40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1ba50 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
1ba60 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
1ba70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
1ba80 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1ba90 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
1baa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1bab0 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
1bac0 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  b,.         sqli
1bad0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1bae0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
1baf0 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
1bb00 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
1bb10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bb20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp1(v, OP_Expi
1bb30 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  re, 0);.    }.. 
1bb40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1bb50 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78  mpHere(v, pIndex
1bb60 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  ->tnum);.  }..  
1bb70 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
1bb80 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
1bb90 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
1bba0 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
1bbb0 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
1bbc0 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
1bbd0 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
1bbe0 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
1bbf0 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
1bc00 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
1bc10 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
1bc20 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
1bc30 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
1bc40 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
1bc50 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
1bc60 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
1bc70 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
1bc80 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
1bc90 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
1bca0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
1bcb0 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
1bcc0 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
1bcd0 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
1bce0 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
1bcf0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
1bd00 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
1bd10 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1bd20 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
1bd30 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1bd40 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1bd50 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
1bd60 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1bd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
1bd80 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
1bd90 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1bda0 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
1bdb0 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
1bdc0 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
1bdd0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
1bde0 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
1bdf0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1be00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1be10 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
1be20 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1be30 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
1be40 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1be50 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64  .    pRet = pInd
1be60 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d  ex;.    pIndex =
1be70 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
1be80 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
1be90 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
1bea0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
1beb0 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65 49  ( pIndex ) freeI
1bec0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
1bed0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1bee0 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65  elete(db, pPIWhe
1bef0 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  re);.  sqlite3Ex
1bf00 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
1bf10 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74   pList);.  sqlit
1bf20 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1bf30 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  db, pTblName);. 
1bf40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1bf50 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
1bf60 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
1bf70 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
1bf80 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
1bf90 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
1bfa0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
1bfb0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
1bfc0 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
1bfd0 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
1bfe0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1bff0 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
1c000 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20  [0] is supposed 
1c010 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1c020 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1c030 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1c040 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1c050 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1c060 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1c070 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1c080 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1c090 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1c0a0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1c0b0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1c0c0 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1c0d0 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1c0e0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1c0f0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1c100 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1c110 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1c120 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1c130 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1c140 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
1c150 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
1c160 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
1c170 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
1c180 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
1c190 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
1c1a0 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
1c1b0 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
1c1c0 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
1c1d0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1c1e0 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
1c1f0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
1c200 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
1c210 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
1c220 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
1c230 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
1c240 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
1c250 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
1c260 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
1c270 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
1c280 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
1c290 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
1c2a0 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
1c2b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
1c2c0 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
1c2d0 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20   *pIdx){.  /*   
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c               10,
1c2f0 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20    9,  8,  7,  6 
1c300 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c  */.  LogEst aVal
1c310 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33  [] = { 33, 32, 3
1c320 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c  0, 28, 26 };.  L
1c330 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d  ogEst *a = pIdx-
1c340 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  >aiRowLogEst;.  
1c350 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
1c360 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c  ArraySize(aVal),
1c370 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
1c380 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1c390 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e  Set the first en
1c3a0 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72  try (number of r
1c3b0 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
1c3c0 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  ) to the estimat
1c3d0 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ed .  ** number 
1c3e0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1c3f0 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66 20  able. Or 10, if 
1c400 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
1c410 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20  mber of rows .  
1c420 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ** in the table 
1c430 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61  is less than tha
1c440 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20  t.  */.  a[0] = 
1c450 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
1c460 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20  owLogEst;.  if( 
1c470 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d  a[0]<33 ) a[0] =
1c480 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73 65   33;        asse
1c490 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 33==sqlite3L
1c4a0 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20  ogEst(10) );..  
1c4b0 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74  /* Estimate that
1c4c0 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32   a[1] is 10, a[2
1c4d0 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20  ] is 9, a[3] is 
1c4e0 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b  8, a[4] is 7, a[
1c4f0 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64  5] is.  ** 6 and
1c500 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c510 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20   value (if any) 
1c520 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63  is 5.  */.  memc
1c530 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20  py(&a[1], aVal, 
1c540 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67  nCopy*sizeof(Log
1c550 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  Est));.  for(i=n
1c560 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d  Copy+1; i<=pIdx-
1c570 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
1c580 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20      a[i] = 23;  
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71    assert( 23==sq
1c5b0 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29  lite3LogEst(5) )
1c5c0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1c5d0 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
1c5e0 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73  t(1) );.  if( Is
1c5f0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1c600 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79  ) ) a[pIdx->nKey
1c610 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Col] = 0;.}../*.
1c620 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c630 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
1c640 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
1c650 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
1c660 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
1c670 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
1c680 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1c690 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
1c6a0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
1c6b0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
1c6c0 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
1c6d0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1c6e0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
1c6f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c700 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
1c710 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
1c720 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1c730 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
1c740 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
1c750 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
1c760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c770 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1c780 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1c790 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
1c7a0 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
1c7b0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1c7c0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1c7d0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
1c7e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c7f0 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
1c800 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1c810 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
1c820 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
1c830 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1c840 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
1c850 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
1c860 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
1c870 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c880 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1c890 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
1c8a0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
1c8b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1c8c0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1c8d0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
1c8e0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1c8f0 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
1c900 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1c910 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
1c920 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c930 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
1c940 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  ndex->idxType!=S
1c950 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1c960 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  PDEF ){.    sqli
1c970 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c980 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
1c990 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
1c9a0 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
1c9b0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1c9c0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
1c9d0 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
1c9e0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1c9f0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
1ca00 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1ca10 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
1ca20 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
1ca30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ca40 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1ca50 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
1ca60 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
1ca70 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
1ca80 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
1ca90 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
1caa0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
1cab0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1cac0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1cad0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
1cae0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
1caf0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1cb00 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1cb10 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
1cb20 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1cb30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1cb40 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1cb50 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1cb60 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
1cb70 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1cb80 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1cb90 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1cba0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1cbb0 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
1cbc0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1cbd0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1cbe0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cbf0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
1cc00 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
1cc10 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
1cc20 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
1cc30 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
1cc40 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
1cc50 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1cc60 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1cc70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1cc80 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1cc90 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1cca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
1ccb0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1ccc0 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
1ccd0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
1cce0 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
1ccf0 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
1cd00 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1cd10 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
1cd20 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78  BLE(iDb), pIndex
1cd30 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
1cd40 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
1cd50 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
1cd60 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
1cd70 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
1cd80 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1cd90 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1cda0 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
1cdb0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
1cdc0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
1cdd0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
1cde0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1cdf0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
1ce00 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
1ce10 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
1ce20 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
1ce30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1ce40 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
1ce50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
1ce60 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1ce70 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
1ce80 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
1ce90 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
1cea0 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
1ceb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
1cec0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
1ced0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1cee0 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
1cef0 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
1cf00 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
1cf10 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
1cf20 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
1cf30 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
1cf40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1cf50 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
1cf60 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
1cf70 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
1cf80 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
1cf90 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
1cfa0 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
1cfb0 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
1cfc0 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
1cfd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1cfe0 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
1cff0 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
1d000 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
1d010 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
1d020 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1d030 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
1d040 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
1d050 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
1d060 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
1d070 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
1d080 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
1d090 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1d0a0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
1d0b0 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
1d0c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
1d0d0 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
1d0e0 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
1d0f0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
1d100 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1d110 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
1d120 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1d130 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
1d140 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
1d150 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
1d160 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
1d170 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
1d180 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1d190 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1d1a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1d1b0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1d1c0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1d1d0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
1d1e0 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
1d1f0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
1d200 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
1d210 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
1d220 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
1d230 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
1d240 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
1d250 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
1d260 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d270 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
1d280 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
1d290 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
1d2a0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
1d2b0 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
1d2c0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
1d2d0 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20  har *z;.  int n 
1d2e0 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66  = *pnEntry;.  if
1d2f0 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30  ( (n & (n-1))==0
1d300 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d   ){.    int sz =
1d310 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a   (n==0) ? 1 : 2*
1d320 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  n;.    void *pNe
1d330 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1d340 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
1d350 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20   sz*szEntry);.  
1d360 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1d370 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
1d380 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1d390 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
1d3a0 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
1d3b0 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
1d3c0 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
1d3d0 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
1d3e0 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
1d3f0 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20  .  *pIdx = n;.  
1d400 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
1d410 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
1d420 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1d430 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1d440 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
1d450 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
1d460 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1d470 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
1d480 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
1d490 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
1d4a0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1d4b0 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
1d4c0 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
1d4d0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1d4e0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
1d4f0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
1d500 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1d510 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1d520 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1d530 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1d540 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1d550 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1d560 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1d570 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1d580 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1d590 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1d5a0 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1d5b0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1d5c0 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1d5d0 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1d5e0 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1d5f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1d600 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1d610 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1d620 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1d630 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1d640 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d650 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1d660 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1d670 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1d680 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
1d690 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
1d6a0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1d6b0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1d6c0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1d6d0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1d6e0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1d6f0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1d700 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1d710 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1d720 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
1d730 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1d740 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
1d750 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d760 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1d770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1d780 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1d790 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1d7a0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1d7b0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1d7c0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1d7d0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1d7e0 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1d7f0 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1d800 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1d810 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d820 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1d830 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1d840 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1d850 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1d860 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1d870 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1d880 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1d890 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1d8a0 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1d8b0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1d8c0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1d8d0 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1d8e0 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1d8f0 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1d900 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1d910 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1d920 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1d930 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1d940 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d950 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1d960 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1d970 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1d980 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1d990 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1d9a0 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1d9b0 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1d9c0 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1d9d0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1d9e0 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1d9f0 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1da00 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1da10 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1da20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1da30 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1da40 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1da50 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1da60 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1da70 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1da80 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1da90 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1daa0 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1dab0 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1dac0 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1dad0 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1dae0 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1daf0 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1db00 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1db10 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1db20 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1db30 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1db40 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1db50 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1db60 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1db70 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1db80 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1db90 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1dba0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1dbb0 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1dbc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1dbd0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1dbe0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1dbf0 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1dc00 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1dc10 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1dc20 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1dc30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dc40 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1dc50 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1dc60 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1dc70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1dc80 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1dc90 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1dca0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1dcb0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1dcc0 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1dcd0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1dce0 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1dcf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1dd00 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1dd10 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1dd20 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1dd30 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1dd40 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1dd50 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1dd60 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1dd70 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1dd80 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1dd90 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1dda0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1ddb0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1ddc0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1ddd0 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1dde0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ddf0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1de00 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1de10 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1de20 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1de30 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1de40 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1de50 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1de60 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1de70 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1de80 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1de90 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1dea0 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1deb0 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1dec0 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1ded0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1dee0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1def0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1df00 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1df10 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1df20 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1df30 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1df40 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1df50 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1df60 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1df70 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1df80 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1df90 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1dfa0 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1dfb0 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1dfc0 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1dfd0 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1dfe0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1dff0 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1e000 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1e010 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1e020 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1e030 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1e040 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1e050 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1e060 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1e070 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1e080 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1e090 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1e0a0 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1e0b0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1e0c0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1e0d0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1e0e0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1e0f0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1e100 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1e110 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1e120 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1e130 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1e140 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1e150 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1e160 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1e170 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1e180 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1e190 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1e1a0 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1e1b0 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1e1c0 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1e1d0 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1e1e0 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1e1f0 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1e200 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1e210 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1e220 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1e230 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1e240 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1e250 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e260 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1e270 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1e280 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1e290 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1e2a0 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1e2b0 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1e2c0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1e2d0 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1e2e0 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1e2f0 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1e300 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1e310 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1e320 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1e330 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1e340 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1e350 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1e360 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1e370 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1e380 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1e390 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1e3a0 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1e3b0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1e3c0 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1e3d0 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1e3e0 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1e3f0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1e400 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1e410 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1e420 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1e430 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1e440 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1e450 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1e460 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1e470 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e480 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1e490 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1e4a0 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1e4b0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1e4c0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e4d0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1e4e0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1e4f0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1e500 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e510 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1e520 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
1e530 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
1e540 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
1e550 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e560 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
1e570 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
1e580 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
1e590 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
1e5a0 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
1e5b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e5c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1e5d0 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
1e5e0 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
1e5f0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
1e600 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
1e610 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
1e620 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
1e630 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
1e640 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
1e650 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1e660 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e670 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
1e680 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
1e690 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1e6a0 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1e6b0 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
1e6c0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
1e6d0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
1e6e0 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
1e6f0 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
1e700 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
1e710 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
1e720 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
1e730 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1e740 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
1e750 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
1e760 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
1e770 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e780 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
1e790 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
1e7a0 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
1e7b0 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
1e7c0 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66  ithout B */.  if
1e7d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1e7e0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e7f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
1e800 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
1e810 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1e820 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1e830 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
1e840 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73  oc = 1;.    pLis
1e850 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20 7d  t->nSrc = 0;.  }
1e860 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1e870 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1e880 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70  (db, pList, 1, p
1e890 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69  List->nSrc);.  i
1e8a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1e8b0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
1e8c0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1e8d0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1e8e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e8f0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
1e900 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
1e910 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
1e920 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
1e930 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
1e940 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
1e950 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
1e960 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65  {.    Token *pTe
1e970 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a  mp = pDatabase;.
1e980 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1e990 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62  pTable;.    pTab
1e9a0 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a  le = pTemp;.  }.
1e9b0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
1e9c0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1e9d0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1e9e0 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
1e9f0 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
1ea00 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1ea10 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72   pDatabase);.  r
1ea20 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1ea30 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62  /*.** Assign Vdb
1ea40 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75  eCursor index nu
1ea50 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  mbers to all tab
1ea60 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
1ea70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ea80 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1ea90 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
1eaa0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
1eab0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1eac0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1ead0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
1eae0 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50  sert(pList || pP
1eaf0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1eb00 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
1eb10 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
1eb20 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
1eb30 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
1eb40 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1eb50 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +){.      if( pI
1eb60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20  tem->iCursor>=0 
1eb70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
1eb80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
1eb90 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1eba0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1ebb0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1ebc0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1ebd0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
1ebe0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1ebf0 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20  Select->pSrc);. 
1ec00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ec10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1ec20 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
1ec30 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
1ec40 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
1ec50 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1ec60 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1ec70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63  sqlite3 *db, Src
1ec80 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1ec90 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1eca0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ecb0 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
1ecc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1ecd0 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
1ece0 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
1ecf0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1ed00 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
1ed10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1ed20 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
1ed30 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ed40 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
1ed50 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1ed60 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1ed70 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
1ed80 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
1ed90 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69 74  ndexedBy ) sqlit
1eda0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1edb0 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
1edc0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  y);.    if( pIte
1edd0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
1ede0 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ) sqlite3ExprLis
1edf0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1ee00 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1ee10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
1ee20 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65  teTable(db, pIte
1ee30 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71  m->pTab);.    sq
1ee40 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1ee50 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  e(db, pItem->pSe
1ee60 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
1ee70 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1ee80 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20   pItem->pOn);.  
1ee90 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1eea0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1eeb0 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
1eec0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1eed0 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
1eee0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1eef0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1ef00 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61   parser to add a
1ef10 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65   new term to the
1ef20 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f  .** end of a gro
1ef30 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65  wing FROM clause
1ef40 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d  .  The "p" param
1ef50 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74  eter is the part
1ef60 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   of.** the FROM 
1ef70 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20  clause that has 
1ef80 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e  already been con
1ef90 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69  structed.  "p" i
1efa0 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69  s NULL.** if thi
1efb0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1efc0 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
1efd0 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20  clause.  pTable 
1efe0 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  and pDatabase.**
1eff0 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66   are the name of
1f000 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64   the table and d
1f010 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e  atabase named in
1f020 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f030 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62   term..** pDatab
1f040 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  ase is NULL if t
1f050 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1f060 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69   qualifier is mi
1f070 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75  ssing - the.** u
1f080 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74  sual case.  If t
1f090 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61  he term has an a
1f0a0 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
1f0b0 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
1f0c0 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
1f0d0 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
1f0e0 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
1f0f0 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
1f100 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
1f110 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
1f120 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
1f130 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
1f140 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
1f150 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
1f160 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
1f170 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
1f180 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
1f190 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
1f1a0 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
1f1b0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
1f1c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
1f1d0 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
1f1e0 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
1f1f0 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
1f200 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
1f210 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1f220 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1f230 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
1f240 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1f250 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1f260 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1f270 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
1f280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1f290 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
1f2a0 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
1f2b0 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
1f2c0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1f2d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f2e0 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
1f2f0 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
1f300 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
1f310 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
1f320 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1f330 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1f340 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
1f350 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
1f360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1f370 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1f380 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
1f390 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
1f3a0 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
1f3b0 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
1f3c0 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
1f3d0 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
1f3e0 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f400 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1f410 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
1f420 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
1f430 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
1f440 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
1f450 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
1f460 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1f470 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
1f480 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1f490 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
1f4a0 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
1f4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1f4c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1f4d0 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
1f4e0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
1f4f0 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
1f500 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
1f510 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
1f520 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1f530 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
1f540 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f550 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
1f560 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
1f570 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
1f580 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
1f590 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1f5a0 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1f5b0 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
1f5c0 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f5d0 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
1f5e0 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
1f5f0 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1f600 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1f610 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1f620 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1f630 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1f640 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1f650 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1f660 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1f670 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1f680 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
1f690 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
1f6a0 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
1f6b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1f6c0 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
1f6d0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1f6e0 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
1f6f0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1f700 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1f710 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
1f720 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
1f730 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
1f740 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
1f750 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
1f760 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
1f770 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1f780 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1f790 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1f7a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1f7b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1f7c0 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1f7d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1f7e0 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1f7f0 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1f800 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1f810 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1f820 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1f830 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1f840 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f850 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1f860 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1f870 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1f880 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
1f890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1f8a0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
1f8b0 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
1f8c0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
1f8d0 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
1f8e0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
1f8f0 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
1f900 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
1f910 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
1f920 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
1f930 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
1f940 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
1f950 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
1f960 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
1f970 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1f980 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
1f990 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1f9a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1f9b0 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20  ->u1.zIndexedBy 
1f9c0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f9d0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1f9e0 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a  b, pIndexedBy);.
1f9f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
1fa00 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28 70  isIndexedBy = (p
1fa10 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
1fa20 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  dBy!=0);.    }. 
1fa30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
1fa40 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63  the list of func
1fa50 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
1fa60 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e  o the SrcList en
1fa70 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  try for a.** tab
1fa80 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69  le-valued-functi
1fa90 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
1faa0 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
1fab0 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  gs(Parse *pParse
1fac0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78  , SrcList *p, Ex
1fad0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
1fae0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
1faf0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1fb00 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1fb10 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1fb20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1fb30 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1fb40 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1fb50 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1fb60 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1fb70 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1fb80 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1fb90 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  );.    pItem->u1
1fba0 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73  .pFuncArg = pLis
1fbb0 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  t;.    pItem->fg
1fbc0 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a  .isTabFunc = 1;.
1fbd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1fbe0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1fbf0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
1fc00 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  List);.  }.}../*
1fc10 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1fc20 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1fc30 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1fc40 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1fc50 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1fc60 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1fc70 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1fc80 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1fc90 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1fca0 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1fcb0 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1fcc0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1fcd0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1fce0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1fcf0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1fd00 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1fd10 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1fd20 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1fd30 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1fd40 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1fd50 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1fd60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1fd70 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1fd80 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1fd90 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1fda0 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1fdb0 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1fdc0 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1fdd0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1fde0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1fdf0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1fe00 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1fe10 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1fe20 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1fe30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1fe40 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1fe50 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1fe60 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1fe70 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1fe80 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1fe90 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
1fea0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
1feb0 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
1fec0 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
1fed0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
1fee0 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69  p->a[i-1].fg.joi
1fef0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1ff00 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e   p->a[0].fg.join
1ff10 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  type = 0;.  }.}.
1ff20 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74  ./*.** Begin a t
1ff30 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1ff40 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54  id sqlite3BeginT
1ff50 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
1ff60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79   *pParse, int ty
1ff70 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pe){.  sqlite3 *
1ff80 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
1ff90 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
1ffa0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1ffb0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1ffc0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  b;.  assert( db!
1ffd0 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62  =0 );./*  if( db
1ffe0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
1fff0 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69  ) return; */.  i
20000 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
20010 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20020 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
20030 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
20040 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
20050 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
20060 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
20070 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
20080 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
20090 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
200a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
200b0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
200c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
200d0 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
200e0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
200f0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
20100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20110 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
20120 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
20130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20140 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
20150 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  mit, 0, 0);.}../
20160 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
20170 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
20180 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
20190 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
201a0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
201b0 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
201c0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
201d0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
201e0 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
201f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
20200 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
20210 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
20220 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
20230 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
20240 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
20250 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
20260 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
20270 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20280 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
20290 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 0);.  }.}../*
202a0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74  .** Rollback a t
202b0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
202c0 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
202d0 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ckTransaction(Pa
202e0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
202f0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
20300 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
20310 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
20320 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
20330 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
20340 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
20350 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
20360 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29  ROLLBACK", 0, 0)
20370 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20380 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
20390 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
203a0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
203b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
203c0 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
203d0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
203e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
203f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20400 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
20410 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
20420 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
20430 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
20440 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
20450 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
20460 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
20470 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
20480 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
20490 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
204a0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
204b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
204c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
204d0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
204e0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
204f0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20500 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
20510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20520 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
20530 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
20540 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
20550 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
20560 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
20570 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
20580 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
20590 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
205a0 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
205b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
205c0 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
205d0 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
205e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
205f0 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
20600 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
20610 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
20620 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
20630 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
20640 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
20650 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20660 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20670 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
20680 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
20690 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
206a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
206b0 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
206c0 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
206d0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
206e0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
206f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
20700 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
20710 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
20720 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
20730 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
20740 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
20750 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
20760 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
20770 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20780 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
20790 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
207a0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
207b0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
207c0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
207d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
207e0 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
207f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
20800 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
20810 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20820 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
20830 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
20840 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
20850 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20860 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
20870 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
20880 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20890 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
208a0 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
208b0 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
208c0 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
208d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
208e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
208f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20900 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
20910 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
20920 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
20930 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
20940 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
20950 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
20960 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
20970 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
20980 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
20990 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
209a0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
209b0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
209c0 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
209d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
209e0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
209f0 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
20a00 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
20a10 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) ){.      db->m
20a20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
20a30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
20a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20a50 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20a60 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
20a70 74 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20  that the schema 
20a80 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64  cookie will need
20a90 20 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a   to be verified.
20aa0 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ** for database 
20ab0 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74  iDb.  The code t
20ac0 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66  o actually verif
20ad0 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
20ae0 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75  kie.** will occu
20af0 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  r at the end of 
20b00 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44  the top-level VD
20b10 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67  BE and will be g
20b20 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65  enerated.** late
20b30 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e  r, by sqlite3Fin
20b40 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a  ishCoding()..*/.
20b50 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
20b60 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
20b70 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
20b80 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
20b90 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
20ba0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
20bb0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
20bc0 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76  e3 *db = pToplev
20bd0 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  el->db;..  asser
20be0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
20bf0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
20c00 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
20c10 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
20c20 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
20c30 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
20c40 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
20c50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
20c60 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
20c70 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
20c80 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
20c90 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
20ca0 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
20cb0 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
20cc0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
20cd0 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
20ce0 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
20cf0 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62  eValue[iDb] = db
20d00 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
20d10 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
20d20 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  e;.    if( !OMIT
20d30 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
20d40 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
20d50 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
20d60 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  se(pToplevel);. 
20d70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20d80 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44  * If argument zD
20d90 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  b is NULL, then 
20da0 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65  call sqlite3Code
20db0 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66  VerifySchema() f
20dc0 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61  or each .** atta
20dd0 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f  ched database. O
20de0 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65  therwise, invoke
20df0 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61   it for the data
20e00 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f  base named zDb o
20e10 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
20e20 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
20e30 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20  medSchema(Parse 
20e40 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
20e50 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c  har *zDb){.  sql
20e60 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
20e70 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
20e80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
20e90 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
20ea0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
20eb0 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
20ec0 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62  Db->pBt && (!zDb
20ed0 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   || 0==sqlite3St
20ee0 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e  rICmp(zDb, pDb->
20ef0 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20  zName)) ){.     
20f00 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
20f10 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
20f20 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
20f30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20f40 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
20f50 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
20f60 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
20f70 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
20f80 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
20f90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
20fa0 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
20fb0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
20fc0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
20fd0 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
20fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
20ff0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
21000 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
21010 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
21020 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
21030 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
21040 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
21050 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
21060 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
21070 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
21080 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
21090 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
210a0 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
210b0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
210c0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
210d0 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
210e0 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
210f0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
21100 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
21110 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
21120 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
21130 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
21140 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
21150 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
21160 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
21170 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
21180 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
21190 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
211a0 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
211b0 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
211c0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
211d0 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
211e0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
211f0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
21200 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21210 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
21220 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
21230 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
21240 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
21250 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
21260 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
21270 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
21280 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
21290 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
212a0 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  ask, iDb);.  pTo
212b0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
212c0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
212d0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
212e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
212f0 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
21300 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
21310 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
21320 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
21330 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
21340 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
21350 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
21360 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
21370 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
21380 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
21390 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
213a0 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
213b0 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
213c0 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
213d0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
213e0 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
213f0 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
21400 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
21410 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
21420 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
21430 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
21440 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
21450 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
21460 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
21470 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
21480 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
21490 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
214a0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
214b0 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
214c0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
214d0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
214e0 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
214f0 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
21500 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
21510 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
21520 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
21530 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
21540 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
21550 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
21560 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
21570 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
21580 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
21590 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
215a0 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
215b0 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
215c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
215d0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
215e0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
215f0 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
21600 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
21610 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
21620 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
21630 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
21640 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
21650 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
21660 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
21670 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
21680 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
21690 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
216a0 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
216b0 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
216c0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
216d0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
216e0 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
216f0 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
21700 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
21710 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
21720 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
21730 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
21740 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
21750 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
21760 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
21770 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
21780 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
21790 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
217a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
217b0 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
217c0 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
217d0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
217e0 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
217f0 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
21800 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
21810 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
21820 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
21830 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21840 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21850 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21860 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21870 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
21880 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
21890 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
218a0 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
218b0 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
218c0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
218d0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
218e0 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
218f0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
21900 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
21910 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
21920 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
21930 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
21940 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
21950 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21960 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
21970 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21980 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
21990 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
219a0 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
219b0 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
219c0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
219d0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
219e0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
219f0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
21a00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
21a10 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20  message */.  i8 
21a20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f  p4type,        /
21a30 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
21a40 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20  4_TRANSIENT */. 
21a50 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20   u8 p5Errmsg    
21a60 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20     /* P5_ErrMsg 
21a70 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  type */.){.  Vdb
21a80 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
21a90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
21aa0 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64   assert( (errCod
21ab0 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  e&0xff)==SQLITE_
21ac0 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20  CONSTRAINT );.  
21ad0 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
21ae0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
21af0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
21b00 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
21b10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21b20 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64   OP_Halt, errCod
21b30 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  e, onError, 0, p
21b40 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71  4, p4type);.  sq
21b50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
21b60 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a  5(v, p5Errmsg);.
21b70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
21b80 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
21b90 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
21ba0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
21bb0 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76   violation..*/.v
21bc0 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75  oid sqlite3Uniqu
21bd0 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  eConstraint(.  P
21be0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
21bf0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
21c00 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
21c10 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
21c20 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
21c30 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
21c40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
21c50 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20  x that triggers 
21c60 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
21c70 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
21c80 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74  r;.  int j;.  St
21c90 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20  rAccum errMsg;. 
21ca0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
21cb0 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20  Idx->pTable;..  
21cc0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
21cd0 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61  nit(&errMsg, pPa
21ce0 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32  rse->db, 0, 0, 2
21cf0 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  00);.  if( pIdx-
21d00 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20  >aColExpr ){.   
21d10 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
21d20 26 65 72 72 4d 73 67 2c 20 30 2c 20 22 69 6e 64  &errMsg, 0, "ind
21d30 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e  ex '%q'", pIdx->
21d40 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
21d50 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
21d60 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  pIdx->nKeyCol; j
21d70 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
21d80 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73  *zCol;.      ass
21d90 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ert( pIdx->aiCol
21da0 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[j]>=0 );.   
21db0 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
21dc0 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
21dd0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
21de0 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c       if( j ) sql
21df0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
21e00 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22  nd(&errMsg, ", "
21e10 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
21e20 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d  te3XPrintf(&errM
21e30 73 67 2c 20 30 2c 20 22 25 73 2e 25 73 22 2c 20  sg, 0, "%s.%s", 
21e40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
21e50 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
21e60 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74  zErr = sqlite3St
21e70 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72  rAccumFinish(&er
21e80 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
21e90 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
21ea0 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72  Parse, .    IsPr
21eb0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
21ec0 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e  dx) ? SQLITE_CON
21ed0 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
21ee0 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY .            
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f00 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  : SQLITE_CONSTRA
21f10 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
21f20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
21f30 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
21f40 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
21f50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
21f60 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
21f70 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
21f80 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
21f90 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
21fa0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
21fb0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
21fc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
21fd0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
21fe0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
21ff0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
22000 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
22010 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
22020 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
22030 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
22040 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
22050 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
22060 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
22070 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
22080 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
22090 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
220a0 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
220b0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
220d0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
220e0 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
220f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22100 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
22110 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
22120 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22130 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
22140 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
22150 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
22160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22170 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
22180 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
22190 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
221a0 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
221b0 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
221c0 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
221d0 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
221e0 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
221f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
22200 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
22210 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
22220 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
22230 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
22240 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
22250 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
22260 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
22270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22280 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
22290 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
222a0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
222b0 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
222c0 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
222d0 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
222e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
222f0 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
22300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
22310 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
22320 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
22330 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
22340 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
22350 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
22360 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
22370 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
22380 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
22390 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
223a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
223b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
223c0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
223d0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
223e0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
223f0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
22400 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22410 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
22420 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
22430 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22440 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
22450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22460 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
22470 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
22480 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
22490 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
224a0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
224b0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
224c0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
224d0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
224e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
224f0 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
22500 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
22510 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
22520 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
22530 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
22540 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
22550 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
22560 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
22570 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
22580 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
22590 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
225a0 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
225b0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
225c0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
225d0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
225e0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
225f0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
22600 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
22610 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
22620 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
22630 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
22640 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
22650 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
22660 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
22670 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
22680 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
22690 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
226a0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
226b0 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
226c0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
226d0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
226e0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
226f0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
22700 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
22710 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
22720 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
22750 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
22760 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
22780 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
22790 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
227a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
227b0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
227c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
227d0 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
22800 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
22810 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
22820 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
22830 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
22840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
22850 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
22860 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22870 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
22880 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
22890 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
228a0 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
228b0 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
228c0 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
228d0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
228e0 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
228f0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
22900 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
22910 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
22920 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
22930 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
22940 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
22950 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
22960 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
22970 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
22980 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
22990 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
229a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
229b0 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
229c0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
229d0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
22a00 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
22a10 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
22a20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
22a30 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
22a40 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
22a50 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
22a60 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
22a70 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
22a80 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
22a90 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
22aa0 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
22ab0 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
22ac0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
22ad0 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
22ae0 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
22af0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
22b00 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
22b10 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
22b20 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
22b30 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
22b40 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
22b50 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
22b60 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
22b70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22b80 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
22b90 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
22ba0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
22bb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
22bc0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
22bd0 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
22be0 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
22bf0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
22c00 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
22c10 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
22c20 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
22c30 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
22c40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
22c70 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
22c80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
22c90 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
22ca0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
22cb0 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
22cc0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
22cd0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
22ce0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
22cf0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
22d00 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
22d10 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
22d20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
22d30 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
22d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d50 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
22d60 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
22d70 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
22d80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22d90 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
22da0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
22db0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
22dc0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
22dd0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
22de0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
22df0 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
22e00 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
22e10 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
22e20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
22e30 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
22e40 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
22e50 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
22e60 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
22e70 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
22e80 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
22e90 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
22ea0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
22eb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
22ec0 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
22ed0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
22ee0 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
22ef0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
22f00 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
22f10 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
22f20 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
22f30 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
22f40 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
22f50 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
22f60 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
22f70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
22f80 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
22f90 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
22fa0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
22fb0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
22fc0 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
22fd0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
22fe0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
22ff0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
23000 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
23010 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23020 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
23030 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
23040 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
23050 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
23060 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
23070 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
23080 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
23090 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
230a0 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
230b0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
230c0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
230d0 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
230e0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
230f0 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
23100 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
23110 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
23120 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
23130 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
23140 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
23150 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
23160 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
23170 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23180 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
23190 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
231a0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
231b0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
231c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
231d0 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
231e0 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
231f0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
23200 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
23210 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
23220 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
23230 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
23240 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
23250 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
23260 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
23270 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
23280 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
23290 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
232a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
232b0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
232c0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
232d0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
232e0 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
232f0 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79  x..**.** The Key
23300 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  Info structure f
23310 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63  or an index is c
23320 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64  ached in the Ind
23330 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f  ex object..** So
23340 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
23350 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
23360 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72  ces to the retur
23370 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68  ned pointer.  Th
23380 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75  e.** caller shou
23390 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f  ld not try to mo
233a0 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f  dify the KeyInfo
233b0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
233c0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
233d0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
233e0 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
233f0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
23400 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
23410 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
23420 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
23430 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
23440 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
23450 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
23460 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
23470 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
23480 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
23490 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
234a0 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
234b0 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
234c0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
234d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
234e0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
234f0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
23500 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
23510 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
23520 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
23530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
23540 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
23550 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
23560 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
23570 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
23580 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23590 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
235a0 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
235b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
235c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
235d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
235e0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
235f0 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
23600 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
23610 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
23620 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
23650 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
23660 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
23670 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
23680 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
23690 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
236a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
236b0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
236c0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
236d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
236e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
236f0 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
23700 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23710 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
23720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23730 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
23740 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
23750 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
23760 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
23770 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
23780 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
23790 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
237a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
237b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
237c0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
237d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
237e0 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
237f0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
23800 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
23810 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23820 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
23830 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
23840 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
23850 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
23860 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
23870 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
23880 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
23890 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
238a0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
238b0 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
238c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
238d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
238e0 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
238f0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
23900 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
23910 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
23920 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
23930 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
23940 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
23950 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
23960 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
23970 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
23980 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
23990 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
239a0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
239b0 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
239c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
239d0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
239e0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
239f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
23a00 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
23a10 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
23a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
23a30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
23a40 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
23a50 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
23a60 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
23a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23a80 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
23a90 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
23aa0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
23ab0 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
23ac0 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
23ad0 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
23ae0 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
23af0 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
23b00 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
23b10 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
23b20 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
23b30 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
23b40 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
23b50 20 7a 4e 61 6d 65 21 3d 30 20 7c 7c 20 70 4e 65   zName!=0 || pNe
23b60 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
23b70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
23b80 65 64 3d 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30  ed==0 || pNew==0
23b90 20 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d   );..  if( pNew=
23ba0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
23bb0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
23bc0 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20  db, pArglist);. 
23bd0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
23be0 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72  Delete(db, pQuer
23bf0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
23c00 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
23c10 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69  ;.    pNew = pWi
23c20 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th;.  }else{.   
23c30 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
23c40 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70  Cte].pSelect = p
23c50 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d  Query;.    pNew-
23c60 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
23c70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b  Cols = pArglist;
23c80 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
23c90 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d  w->nCte].zName =
23ca0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77   zName;.    pNew
23cb0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
23cc0 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
23cd0 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20   pNew->nCte++;. 
23ce0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   }..  return pNe
23cf0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
23d00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
23d10 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
23d20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23d30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
23d40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
23d50 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ithDelete(sqlite
23d60 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69  3 *db, With *pWi
23d70 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
23d80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23d90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
23da0 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
23db0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74  .      struct Ct
23dc0 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68  e *pCte = &pWith
23dd0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
23de0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
23df0 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43  ete(db, pCte->pC
23e00 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
23e10 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
23e20 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
23e30 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
23e40 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65  3DbFree(db, pCte
23e50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
23e60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23e70 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20  e(db, pWith);.  
23e80 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
23e90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
23ea0 49 54 5f 43 54 45 29 20 2a 2f 0a                 IT_CTE) */.