/ Hex Artifact Content
Login

Artifact 784c61366e79092b16e116372e66930775d2e6dc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  0;.    sqlite3Oo
0a30: 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 76 65 6c  mFault(pToplevel
0a40: 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->db);.  }.}../*
0a50: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54  .** Code an OP_T
0a60: 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63  ableLock instruc
0a70: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61  tion for each ta
0a80: 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68  ble locked by th
0a90: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28  e.** statement (
0aa0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63 61  configured by ca
0ab0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61  lls to sqlite3Ta
0ac0: 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73  bleLock())..*/.s
0ad0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54  tatic void codeT
0ae0: 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20  ableLocks(Parse 
0af0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
0b00: 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  i;.  Vdbe *pVdbe
0b10: 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73 71  ; ..  pVdbe = sq
0b20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
0b30: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
0b40: 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20 73  pVdbe!=0 ); /* s
0b50: 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63 61  qlite3GetVdbe ca
0b60: 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45 20  nnot fail: VDBE 
0b70: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
0b80: 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
0b90: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c   i<pParse->nTabl
0ba0: 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  eLock; i++){.   
0bb0: 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d 20   TableLock *p = 
0bc0: 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c  &pParse->aTableL
0bd0: 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  ock[i];.    int 
0be0: 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 20  p1 = p->iDb;.   
0bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0c00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0c10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0c20: 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65 4c  Tab, p->isWriteL
0c30: 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
0c40: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
0c50: 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ame, P4_STATIC);
0c60: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
0c70: 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c 65  define codeTable
0c80: 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a  Locks(x).#endif.
0c90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ca0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
0cb0: 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20 69  yDbMask object i
0cc0: 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74 20  s empty - if it 
0cd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 31  contains no.** 1
0ce0: 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f 75   bits.  This rou
0cf0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79 20  tine is used by 
0d00: 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  the DbMaskAllZer
0d10: 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e 6f  o() and DbMaskNo
0d20: 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72 6f  tZero().** macro
0d30: 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d 41  s when SQLITE_MA
0d40: 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67 72  X_ATTACHED is gr
0d50: 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a 2a  eater than 30..*
0d60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
0d70: 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e 74  _ATTACHED>30.int
0d80: 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41 6c   sqlite3DbMaskAl
0d90: 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d 29  lZero(yDbMask m)
0da0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
0db0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 79  (i=0; i<sizeof(y
0dc0: 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69 66  DbMask); i++) if
0dd0: 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( m[i] ) return 
0de0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
0df0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0e10: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0e20: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0e30: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e40: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0e60: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e70: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e80: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e90: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0ea0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0eb0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0ec0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0ed0: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0ee0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0ef0: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0f00: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0f10: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0f20: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0f30: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0f40: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0f50: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f70: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f80: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0fa0: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0fb0: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0fc0: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0fd0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0fe0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
0ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1010: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1020: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
1030: 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  se->rc==SQLITE_O
1040: 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  K ) pParse->rc =
1050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1060: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1070: 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65    /* Begin by ge
1080: 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65  nerating some te
1090: 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61  rmination code a
10a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b0: 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72  .  ** vdbe progr
10c0: 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  am.  */.  v = sq
10d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10f0: 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  !pParse->isMulti
1100: 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c 7c  Write .       ||
1110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
1120: 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70 50  rtMayAbort(v, pP
1130: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 29  arse->mayAbort))
1140: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1150: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 56   while( sqlite3V
1160: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
1170: 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  code(v, OP_Close
1180: 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ) ){}.    sqlite
1190: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11a0: 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51  P_Halt);..#if SQ
11b0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
11c0: 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28  TICATION.    if(
11d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c   pParse->nTableL
11e0: 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69  ock>0 && db->ini
11f0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
1200: 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41 75     sqlite3UserAu
1210: 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20  thInit(db);.    
1220: 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61    if( db->auth.a
1230: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
1240: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ser ){.        p
1250: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1260: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1290: 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74 69  ser not authenti
12a0: 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  cated");.       
12b0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
12c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65     /* The cookie
12e0: 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f   mask contains o
12f0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
1300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
1310: 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20  en..    ** (Bit 
1320: 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62  0 is for main, b
1330: 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70  it 1 is for temp
1340: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29  , and so forth.)
1350: 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a    Bits are.    *
1360: 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20 64  * set for each d
1370: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1380: 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20  used.  Generate 
1390: 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a  code to start a.
13a0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
13b0: 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20  on on each used 
13c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20  database and to 
13d0: 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
13e0: 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20  a cookie.    ** 
13f0: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
1400: 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
1410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1420: 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
1430: 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72  && (DbMaskNonZer
1440: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1450: 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d  Mask) || pParse-
1460: 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20  >pConstExpr).   
1470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1480: 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  b, i;.      asse
1490: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  rt( sqlite3VdbeG
14a0: 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f  etOp(v, 0)->opco
14b0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20  de==OP_Init );. 
14c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a  JumpHere(v, 0);.
14e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b        for(iDb=0;
14f0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
1500: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
1510: 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61  ( DbMaskTest(pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  rse->cookieMask,
1530: 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69   iDb)==0 ) conti
1540: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
1550: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1560: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  e(v, iDb);.     
1570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1580: 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20  dOp4Int(v,.     
1590: 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74       OP_Transact
15a0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
15c0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
15d0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20    /* P1 */.     
1600: 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28       DbMaskTest(
1610: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1620: 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f  k,iDb), /* P2 */
1630: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
1640: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
1650: 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Db],          /*
1660: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P3 */.         
1670: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1680: 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69  chema->iGenerati
1690: 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20  on  /* P4 */.   
16a0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16c0: 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  y==0 ) sqlite3Vd
16d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
16e0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
16f0: 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20  mment((v,.      
1700: 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d          "usesStm
1710: 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50  tJournal=%d", pP
1720: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26  arse->mayAbort &
1730: 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  & pParse->isMult
1740: 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20  iWrite));.      
1750: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1760: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1770: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1780: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1790: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
17a0: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
17b0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17c0: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
17d0: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
17e0: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
17f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1800: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1810: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1820: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
1830: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
1840: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
1850: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1860: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1870: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1880: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1890: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
18a0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
18b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
18c0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
18d0: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
18e0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
18f0: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1900: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1920: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1930: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1940: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1960: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1970: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1990: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
19a0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
19b0: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
19c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
19d0: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
19e0: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
19f0: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a00: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1a10: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1a20: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1a30: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1a40: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1a50: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1a60: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1a70: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aa0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1ab0: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1ac0: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1ad0: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1af0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b00: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1b10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b20: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1b30: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1b40: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31  te3VdbeGoto(v, 1
1b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
1b60: 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45   /* Get the VDBE
1b70: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66   program ready f
1b80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a  or execution.  *
1b90: 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61  /.  if( v && pPa
1ba0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20  rse->nErr==0 && 
1bb0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1bc0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1bd0: 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1be0: 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44  evel==0 );  /* D
1bf0: 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65  isables and re-e
1c00: 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a  nables match */.
1c10: 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d      /* A minimum
1c20: 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69   of one cursor i
1c30: 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75  s required if au
1c40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  toincrement is u
1c50: 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74  sed.    *  See t
1c60: 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31  icket [a696379c1
1c70: 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69  f08866] */.    i
1c80: 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63  f( pParse->pAinc
1c90: 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  !=0 && pParse->n
1ca0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
1cb0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73  >nTab = 1;.    s
1cc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
1cd0: 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a  ady(v, pParse);.
1ce0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1cf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
1d10: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
1d20: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1d30: 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  We are done with
1d40: 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a 65   this Parse obje
1d50: 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ct. There is no 
1d60: 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74 69  need to de-initi
1d70: 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66 20  alize it */.#if 
1d80: 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  0.  pParse->colN
1d90: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 70  amesSet = 0;.  p
1da0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1db0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
1dc0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1dd0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
1de0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 44  e->nVar = 0;.  D
1df0: 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73 65  bMaskZero(pParse
1e00: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a 23  ->cookieMask);.#
1e10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
1e20: 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e  un the parser an
1e30: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  d code generator
1e40: 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20   recursively in 
1e50: 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74  order to generat
1e60: 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68  e.** code for th
1e70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
1e80: 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65  given onto the e
1e90: 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65  nd of the pParse
1ea0: 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72   context.** curr
1eb0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
1ec0: 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20  truction.  When 
1ed0: 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75  the parser is ru
1ee0: 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a  n recursively.**
1ef0: 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66   this way, the f
1f00: 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20  inal OP_Halt is 
1f10: 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64  not appended and
1f20: 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a   other initializ
1f30: 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e  ation.** and fin
1f40: 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20  alization steps 
1f50: 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61  are omitted beca
1f60: 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61  use those are ha
1f70: 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ndling by the.**
1f80: 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65   outermost parse
1f90: 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65  r..**.** Not eve
1fa0: 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61  rything is nesta
1fb0: 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c  ble.  This facil
1fc0: 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20  ity is designed 
1fd0: 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53  to permit.** INS
1fe0: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
1ff0: 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2000: 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54  ns against SQLIT
2010: 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a  E_MASTER.  Use.*
2020: 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65  * care if you de
2030: 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75  cide to try to u
2040: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2050: 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
2060: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
2070: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2080: 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rse(Parse *pPars
2090: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
20c0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
20d0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
20e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20f0: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66  Parse->db;.# def
2100: 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69  ine SAVE_SZ  (si
2110: 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66  zeof(Parse) - of
2120: 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61  fsetof(Parse,nVa
2130: 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42  r)).  char saveB
2140: 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20  uf[SAVE_SZ];..  
2150: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2160: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
2170: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
2180: 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65  ted<10 );  /* Ne
2190: 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c  sting should onl
21a0: 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20  y be of limited 
21b0: 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74  depth */.  va_st
21c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
21d0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
21e0: 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a  e3VMPrintf(db, z
21f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2200: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2210: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
2220: 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d  return;   /* A m
2230: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
2240: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  failed */.  }.  
2250: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b  pParse->nested++
2260: 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42  ;.  memcpy(saveB
2270: 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61  uf, &pParse->nVa
2280: 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d  r, SAVE_SZ);.  m
2290: 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e  emset(&pParse->n
22a0: 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29  Var, 0, SAVE_SZ)
22b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61  ;.  sqlite3RunPa
22c0: 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71  rser(pParse, zSq
22d0: 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, &zErrMsg);.  
22e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f0: 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
2300: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2310: 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28  zSql);.  memcpy(
2320: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73  &pParse->nVar, s
2330: 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29  aveBuf, SAVE_SZ)
2340: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  ;.  pParse->nest
2350: 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ed--;.}..#if SQL
2360: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2370: 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65  ICATION./*.** Re
2380: 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61  turn TRUE if zTa
2390: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
23a0: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61  of the system ta
23b0: 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ble that stores 
23c0: 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75  the.** list of u
23d0: 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61  sers and their a
23e0: 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c  ccess credential
23f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2400: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63  3UserAuthTable(c
2410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
2420: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2430: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61  ite3_stricmp(zTa
2440: 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65  ble, "sqlite_use
2450: 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  r")==0;.}.#endif
2460: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2470: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
2480: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2490: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
24a0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
24b0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
24c0: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
24d0: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
24e0: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
24f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2500: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2510: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2520: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2530: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
2540: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
2550: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
2560: 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  hed for the tabl
2570: 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72  e and the.** fir
2580: 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  st matching tabl
2590: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25a0: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  (No checking for
25b0: 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65   duplicate table
25c0: 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  .** names is don
25d0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
25e0: 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69  order is TEMP fi
25f0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2600: 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69  then any.** auxi
2610: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2620: 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  added using the 
2630: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2640: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2660: 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  e()..*/.Table *s
2670: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
2690: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
26a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
26b0: 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  abase){.  Table 
26c0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
26d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ..  /* All mutex
26e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
26f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
2700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
2710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
2720: 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62 61   assert( zDataba
2730: 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se!=0 || sqlite3
2740: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
2750: 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66 20  exes(db) );.#if 
2760: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2770: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a 20  ENTICATION.  /* 
2780: 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20 75  Only the admin u
2790: 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ser is allowed t
27a0: 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  o know that the 
27b0: 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62 6c  sqlite_user tabl
27c0: 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a 2f  e.  ** exists */
27d0: 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e  .  if( db->auth.
27e0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
27f0: 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65 33  Admin && sqlite3
2800: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a 4e  UserAuthTable(zN
2810: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ame)!=0 ){.    r
2820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
2830: 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54  dif.  for(i=OMIT
2840: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2850: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2860: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2870: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
2880: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
2890: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
28a0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
28b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
28c0: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
28d0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
28e0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
28f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2900: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2910: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2920: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2930: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2940: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
2950: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2960: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2970: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2980: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2990: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
29a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
29b0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
29c0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
29d0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
29e0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
29f0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2a00: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2a10: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a20: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2a30: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2a40: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2a50: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2a60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2a70: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2a80: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2a90: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2aa0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2ab0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2ac0: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2ad0: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2ae0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2af0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2b00: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2b10: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2b20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2b30: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2b40: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2b50: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b60: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2b70: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2b80: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2b90: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2ba0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2bb0: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2bc0: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2bf0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2c00: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2c10: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2c20: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2c30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c40: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2c50: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2c60: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2c70: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2c80: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2c90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2ca0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2cb0: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2cc0: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2cd0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2ce0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2cf0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2d00: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2d10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d20: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2d30: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2d40: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2d50: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2d60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d70: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2d80: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2d90: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2da0: 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ble";.#ifndef SQ
2db0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc0: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 73  LTABLE.    if( s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
2de0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44 62  (pParse->db, zDb
2df0: 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 20  ase)<1 ){.      
2e00: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 74  /* If zName is t
2e10: 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  he not the name 
2e20: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 68  of a table in th
2e30: 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 64  e schema created
2e40: 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   using.      ** 
2e50: 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 65  CREATE, then che
2e60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
2e70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2e80: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  n virtual table 
2e90: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 61  that.      ** ca
2ea0: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2eb0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2ec0: 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c 65   */.      Module
2ed0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2ee0: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2ef0: 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  d(&pParse->db->a
2f00: 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a  Module, zName);.
2f10: 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26        if( pMod &
2f20: 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f  & sqlite3VtabEpo
2f30: 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28  nymousTableInit(
2f40: 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b  pParse, pMod) ){
2f50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f60: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
2f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2f80: 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62 61  dif.    if( zDba
2f90: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
2fa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fb0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
2fc0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
2fd0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ff0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3000: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3010: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3020: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
3030: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 0a  chema = 1;.  }..
3040: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3050: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3060: 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
3070: 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   by *p..**.** Th
3080: 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72 20  is is a wrapper 
3090: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f  around sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65  cateTable(). The
30b0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
30c0: 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f  een.** sqlite3Lo
30d0: 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20  cateTable() and 
30e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30f0: 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
3100: 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a  ion restricts.**
3110: 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 73   the search to s
3120: 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d  chema (p->pSchem
3130: 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  a) if it is not 
3140: 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61  NULL. p->pSchema
3150: 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e   may be.** non-N
3160: 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61 72  ULL if it is par
3170: 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74  t of a view or t
3180: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64  rigger program d
3190: 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a  efinition. See.*
31a0: 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
31b0: 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c  ist() for detail
31c0: 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  s..*/.Table *sql
31d0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
31e0: 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tem(.  Parse *pP
31f0: 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73 56  arse, .  int isV
3200: 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20 53  iew, .  struct S
3210: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29  rcList_item *p.)
3220: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3230: 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  zDb;.  assert( p
3240: 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20  ->pSchema==0 || 
3250: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  p->zDatabase==0 
3260: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63 68  );.  if( p->pSch
3270: 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ema ){.    int i
3280: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
3290: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
32a0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  ->db, p->pSchema
32b0: 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50 61  );.    zDb = pPa
32c0: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
32d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  ].zName;.  }else
32e0: 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a  {.    zDb = p->z
32f0: 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20  Database;.  }.  
3300: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f  return sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
3320: 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61  , isView, p->zNa
3330: 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  me, zDb);.}../*.
3340: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
3350: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
3360: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
3370: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
3380: 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68  r index given th
3390: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69  e name of that i
33a0: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ndex.** and the 
33b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c0: 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69  base that contai
33d0: 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  ns the index..**
33e0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
33f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
3400: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
3410: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
3420: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
3430: 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  or the.** table 
3440: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61  and the first ma
3450: 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20  tching index is 
3460: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
3470: 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64  hecking.** for d
3480: 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e  uplicate index n
3490: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
34a0: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
34b0: 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73   is.** TEMP firs
34c0: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
34d0: 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79  en any auxiliary
34e0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
34f0: 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54  .** using the AT
3500: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  TACH command..*/
3510: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46  .Index *sqlite3F
3520: 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33  indIndex(sqlite3
3530: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3540: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
3550: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
3560: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
3570: 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74   i;.  /* All mut
3580: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
3590: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
35a0: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
35b0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
35c0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d  .  assert( zDb!=
35d0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  0 || sqlite3Btre
35e0: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
35f0: 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  (db) );.  for(i=
3600: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
3610: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3620: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
3630: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
3640: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
3650: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63  e MAIN */.    Sc
3660: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
3670: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
3680: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
3690: 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
36a0: 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65  f( zDb && sqlite
36b0: 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62  3StrICmp(zDb, db
36c0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
36d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
36f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
3700: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
3710: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
3720: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
3730: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  xHash, zName);. 
3740: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3770: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
3780: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
3790: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
37a0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
37b0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
37c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37d0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
37e0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
37f0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3820: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3830: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
3840: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
3850: 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71  >aColExpr);.  sq
3860: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3870: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3880: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3890: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
38a0: 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61  db, (void *)p->a
38b0: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
38c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
38d0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
38e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
38f0: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
3900: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3910: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3920: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
3930: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
3940: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
3950: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3960: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3970: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3980: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3990: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
39a0: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
39b0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
39c0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
39d0: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
39e0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
39f0: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3a00: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3a10: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3a20: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
3a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
3a40: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
3a50: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3a60: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3a70: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3a80: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3a90: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3aa0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3ab0: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3ac0: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3ad0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3ae0: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3b00: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3b10: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3b20: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3b30: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3b40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3b50: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3b60: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3b70: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3b80: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3b90: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3ba0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3bb0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3bc0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3bd0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3be0: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3bf0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3c00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3c10: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3c20: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3c30: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3c40: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3c50: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3c60: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3c70: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3c80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3c90: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3ca0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3cb0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3cc0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3cd0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3ce0: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3cf0: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3d00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3d10: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3d20: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3d30: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3d40: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3d50: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3d60: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3d70: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3d80: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3d90: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3da0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3db0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3dc0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3dd0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3de0: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3df0: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3e00: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3e10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3e20: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3e30: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3e40: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3e50: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3e60: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3e70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3e80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3e90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3ea0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ec0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3ed0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3ee0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3ef0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3f00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3f10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3f20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3f30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
3f40: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3f50: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3f60: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3f70: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f80: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f90: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3fa0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3fc0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3fd0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3fe0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3ff0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4000: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4010: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4020: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
4030: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
4040: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
4050: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
4060: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
4070: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4080: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4090: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
40a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
40b0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
40c0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
40d0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
40e0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
40f0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4100: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4110: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4120: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
4130: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
4170: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4180: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4190: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
41a0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
41b0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
41c0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
41d0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
41e0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
41f0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4200: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4210: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
4220: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4230: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
4240: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
4250: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
4260: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4270: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4280: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4290: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
42a0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
42b0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
42c0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
42d0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
42e0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
42f0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4300: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4310: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4320: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
4330: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4340: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4350: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4360: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
4370: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4380: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4390: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
43a0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
43b0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
43c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43d0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4400: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4410: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4420: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4440: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
4450: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
4460: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4480: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4490: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
44a0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
44b0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
44c0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
44d0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
44e0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
44f0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4500: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4510: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
4520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
4530: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
4540: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
4550: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
4560: 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  y)..*/.void sqli
4570: 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
4580: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4590: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
45b0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
45c0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
45d0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
45e0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
45f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
4600: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
4610: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4630: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4640: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4650: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4660: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
4690: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
46a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
46b0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  l->zType);.     
46c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
46d0: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
46e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
46f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4700: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4720: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4730: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4740: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4750: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4760: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
4770: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
4780: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
4790: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
47a0: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
47b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
47c0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
47d0: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
47e0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
47f0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4800: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4810: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4820: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4830: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4840: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4850: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4860: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
4870: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
4880: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
4890: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
48a0: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
48b0: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
48c0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
48d0: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
48e0: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
48f0: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4900: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4910: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4920: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4930: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4940: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4950: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4960: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4970: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4980: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4990: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
49a0: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
49b0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
49c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
49d0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
49e0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
49f0: 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Next;.  TESTONLY
4a00: 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65  ( int nLookaside
4a10: 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76  ; ) /* Used to v
4a20: 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20  erify lookaside 
4a30: 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68  not used for sch
4a40: 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ema */..  assert
4a50: 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61  ( !pTable || pTa
4a60: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  ble->nRef>0 );..
4a70: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
4a80: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
4a90: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
4aa0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
4ab0: 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  ero. */.  if( !p
4ac0: 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  Table ) return;.
4ad0: 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64    if( ((!db || d
4ae0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4af0: 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65  =0) && (--pTable
4b00: 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74  ->nRef)>0) ) ret
4b10: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  urn;..  /* Recor
4b20: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4b30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b  outstanding look
4b40: 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  aside allocation
4b50: 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c  s in schema Tabl
4b60: 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  es.  ** prior to
4b70: 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28   doing any free(
4b80: 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53  ) operations.  S
4b90: 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c  ince schema Tabl
4ba0: 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20  es do not use.  
4bb0: 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68  ** lookaside, th
4bc0: 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64  is number should
4bd0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a   not change. */.
4be0: 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f    TESTONLY( nLoo
4bf0: 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20  kaside = (db && 
4c00: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4c10: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4c20: 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
4c50: 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a  Out : 0 );..  /*
4c60: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
4c70: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
4c80: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
4c90: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
4ca0: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
4cb0: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
4cc0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
4cd0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
4ce0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
4cf0: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
4d00: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
4d10: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20   );.    if( !db 
4d20: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4d30: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
4d40: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49  char *zName = pI
4d50: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20  ndex->zName; .  
4d60: 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49      TESTONLY ( I
4d70: 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73  ndex *pOld = ) s
4d80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4d90: 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64  (.         &pInd
4da0: 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
4db0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20  Hash, zName, 0. 
4dc0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
4dd0: 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73  sert( db==0 || s
4de0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4df0: 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
4e00: 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
4e10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4e20: 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70  Old==pIndex || p
4e30: 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Old==0 );.    }.
4e40: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62      freeIndex(db
4e50: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
4e60: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
4e70: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74  foreign keys att
4e80: 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
4e90: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
4ea0: 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54  3FkDelete(db, pT
4eb0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  able);..  /* Del
4ec0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
4ed0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
4ee0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65    */.  sqlite3De
4ef0: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4f00: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4f10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4f20: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4f30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4f40: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4f50: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4f60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4f70: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
4f80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4f90: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4fa0: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
4fb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4fc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4fd0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
4fe0: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
4ff0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
5000: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
5010: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  le);..  /* Verif
5020: 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73  y that no lookas
5030: 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75  ide memory was u
5040: 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61  sed by schema ta
5050: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
5060: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20  ( nLookaside==0 
5070: 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64  || nLookaside==d
5080: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
5090: 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  t );.}../*.** Un
50a0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
50b0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
50c0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
50d0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
50e0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
50f0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
5100: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
5110: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
5120: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
5130: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5140: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
5150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
5160: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
5170: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
5180: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
5190: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
51a0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
51b0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
51c0: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73  zTabName );.  as
51d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
51e0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
51f0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65   iDb, 0) );.  te
5200: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
5210: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
5220: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
5230: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
5240: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
5250: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
5260: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
5270: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
5280: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
5290: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
52a0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
52b0: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
52c0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
52d0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
52e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
52f0: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
5300: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
5310: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
5320: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
5330: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
5340: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5350: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
5360: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
5370: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
5380: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
5390: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
53a0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
53b0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
53c0: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
53d0: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
53e0: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
53f0: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
5400: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
5410: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
5420: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
5430: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
5440: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
5450: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
5460: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
5470: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
5480: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
5490: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
54a0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
54b0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
54c0: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
54d0: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
54e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
54f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
5500: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
5510: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
5520: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
5530: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
5540: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
5550: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
5560: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
5570: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
5580: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5590: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
55a0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
55b0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
55c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
55d0: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
55e0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
55f0: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
5600: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
5610: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
5620: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
5630: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
5640: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
5650: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
5660: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
5670: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
5680: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
5690: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
56a0: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
56b0: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
56c0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
56d0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
56e0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
56f0: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5700: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5710: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5730: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
5740: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
5750: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5760: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5770: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5780: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5790: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
57a0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
57b0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
57c0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
57d0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
57e0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
57f0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5800: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5810: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5820: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5830: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5840: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5850: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5860: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5870: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5880: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5890: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
58a0: 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  pDb;.    int n =
58b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
58c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
58d0: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
58e0: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
58f0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5900: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21  -){.      if( (!
5910: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
5920: 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69  !=1 ) && n==sqli
5930: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d  te3Strlen30(pDb-
5940: 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20  >zName) && .    
5950: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
5960: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
5970: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
5980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5990: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
59a0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
59b0: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
59c0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
59d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
59e0: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
59f0: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
5a00: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5a10: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5a20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5a30: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
5a40: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5a50: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5a60: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
5a70: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
5a80: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
5a90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5aa0: 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64  indDb(sqlite3 *d
5ab0: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5ac0: 7b 0a 20 20 69 6e 74 20 69 3b 20 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 2f 2a 20 44 61 74 61           /* Data
5af0: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5b00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 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 2f 2a 20 4e 61 6d 65 20 77 65        /* Name we
5b30: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
5b40: 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  or */.  zName = 
5b50: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5b60: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5b70: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69  .  i = sqlite3Fi
5b80: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61  ndDbName(db, zNa
5b90: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5ba0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
5bb0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5bc0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5bd0: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
5be0: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
5bf0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
5c00: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
5c10: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5c20: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5c30: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5c40: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5c50: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
5c60: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5c70: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
5c80: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5c90: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5ca0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5cb0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5cc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5cd0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5ce0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5cf0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5d00: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
5d10: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5d20: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5d30: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5d40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5d50: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
5d60: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
5d70: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5d80: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5d90: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5da0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5db0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5dc0: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
5dd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5de0: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
5df0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5e00: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
5e10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5e20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5e30: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5e40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5e50: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
5e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
5e70: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
5e80: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
5e90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5ea0: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
5eb0: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
5ec0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
5ed0: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
5ee0: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
5ef0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
5f00: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
5f10: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5f40: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
5f50: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
5f60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5f70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  ;..  assert( pNa
5f80: 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  me2!=0 );.  if( 
5f90: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
5fa0: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
5fb0: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
5fc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5fd0: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
5fe0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
5ff0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
6000: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
6010: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
6020: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
6030: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
6040: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
6050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6060: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
6070: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
6080: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
6090: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
60a0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
60b0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
60c0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
60d0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
60e0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
60f0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
6100: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
6110: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
6120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6130: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
6140: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
6150: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
6160: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
6170: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
6180: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
6190: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
61a0: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
61b0: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
61c0: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
61d0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
61e0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
61f0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
6200: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
6210: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
6220: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
6230: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
6240: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
6250: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6260: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6270: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6280: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6290: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
62a0: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
62b0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
62c0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
62d0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
62e0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
62f0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6300: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
6310: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
6320: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6330: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6340: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6350: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6360: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6370: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
6380: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
6390: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
63a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
63b0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
63c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
63d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
63e0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
63f0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
6400: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
6410: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
6420: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6430: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6440: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6450: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6460: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6470: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
6480: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6490: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
64a0: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
64b0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
64c0: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
64d0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
64e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
64f0: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
6500: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
6510: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
6520: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6530: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6540: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6550: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6560: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6570: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6580: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6590: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
65a0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
65b0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
65c0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
65d0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
65e0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
65f0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
6600: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
6610: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
6620: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6630: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6640: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6650: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6660: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6670: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6680: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6690: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
66a0: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
66b0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
66c0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
66d0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
66e0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
66f0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
6700: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
6710: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
6720: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6730: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6740: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6750: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6760: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6770: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6780: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6790: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
67a0: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
67b0: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
67c0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
67d0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
67e0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
67f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6800: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6810: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6820: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6830: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6840: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6850: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6860: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6870: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6880: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6890: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
68a0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
68b0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
68c0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
68d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
68e0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
68f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6900: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6910: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6920: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6930: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6940: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6950: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6960: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6970: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6980: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6990: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
69a0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
69b0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
69c0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
69d0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
69e0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
69f0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6a00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6a10: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6a20: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6a30: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6a40: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6a50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6a60: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6a70: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6a80: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6a90: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6aa0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6ab0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6ac0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6ad0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
6ae0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6af0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
6b00: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
6b10: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6b20: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
6b30: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
6b40: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6b50: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
6b60: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
6b70: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
6b80: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
6b90: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
6ba0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
6bb0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
6bc0: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
6bd0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
6be0: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
6bf0: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
6c00: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
6c10: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6c20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
6c30: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
6c40: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
6c50: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
6c60: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
6c70: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
6c80: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
6c90: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
6ca0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
6cb0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
6cc0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
6cd0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
6ce0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6cf0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
6d00: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
6d10: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
6d20: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6d30: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
6d40: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
6d50: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
6d60: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
6d70: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
6d80: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
6d90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
6da0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6db0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
6dc0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
6dd0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
6de0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6df0: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
6e00: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6e10: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
6e20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
6e30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
6e40: 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70   pName);.  }.  p
6e50: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
6e60: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66  n = *pName;.  if
6e70: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
6e80: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
6e90: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
6ea0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
6eb0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
6ec0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6ed0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6ee0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
6ef0: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
6f00: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
6f10: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6f20: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69  TION.  assert( i
6f30: 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65  sTemp==0 || isTe
6f40: 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  mp==1 );.  asser
6f50: 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20  t( isView==0 || 
6f60: 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b  isView==1 );.  {
6f70: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
6f80: 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b  t u8 aCode[] = {
6f90: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
6fa0: 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20  REATE_TABLE,.   
6fb0: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
6fc0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20  E_TEMP_TABLE,.  
6fd0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6fe0: 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20  TE_VIEW,.       
6ff0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7000: 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20  MP_VIEW.    };. 
7010: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
7020: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7030: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
7040: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7050: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
7060: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
7070: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
7080: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7090: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
70a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
70b0: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
70c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
70d0: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
70e0: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
70f0: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
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 7a 4e 61 6d 65             zName
7120: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
7130: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7140: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7150: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7160: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
7170: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
7180: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
7190: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
71a0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
71b0: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
71c0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
71d0: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
71e0: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
71f0: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
7200: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
7210: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7220: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
7230: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
7240: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
7250: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
7260: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
7270: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
7280: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
7290: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
72a0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
72b0: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
72c0: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
72d0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
72e0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
72f0: 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  B ){.    char *z
7300: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7310: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
7320: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7330: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
7340: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
7350: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7360: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7370: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7380: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
7390: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
73a0: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
73b0: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
73c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
73d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
73e0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
73f0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
7400: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
7410: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7420: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7430: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
7440: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7450: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
7460: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
7470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
7480: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7490: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
74a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
74b0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
74c0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
74d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
74e0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
74f0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
7500: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
7510: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
7520: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7530: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
7540: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7550: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7560: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
7570: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7580: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7590: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
75a0: 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed );.    pParse
75b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
75c0: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
75d0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
75e0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
75f0: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
7600: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
7610: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
7620: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
7630: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
7640: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
7650: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
7660: 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 1;.  pTable->
7670: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
7680: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
7690: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
76a0: 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73 65 72  8576) );.  asser
76b0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
76c0: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
76d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
76e0: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
76f0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7700: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7710: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7720: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
7730: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
7740: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
7750: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
7760: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
7770: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
7780: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7790: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
77a0: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
77b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
77c0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
77d0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
77e0: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
77f0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7800: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7820: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
7830: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
7840: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
7850: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
7860: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
7870: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
7880: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7890: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
78a0: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
78b0: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
78c0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
78d0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
78e0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
78f0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7900: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7910: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7920: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7930: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
7940: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
7950: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
7960: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
7970: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
7980: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
7990: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
79a0: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
79b0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
79c0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
79d0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
79e0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
79f0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7a00: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7a10: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7a20: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
7a30: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
7a40: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
7a50: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
7a60: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
7a70: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20    int addr1;.   
7a80: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
7a90: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
7aa0: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f  eg2, reg3;.    /
7ab0: 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61  * nullRow[] is a
7ac0: 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f  n OP_Record enco
7ad0: 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f  ding of a row co
7ae0: 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73  ntaining 5 NULLs
7af0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
7b00: 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f  onst char nullRo
7b10: 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c  w[] = { 6, 0, 0,
7b20: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
7b30: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7b40: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7b50: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
7b60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7b70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7b80: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7b90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7ba0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7bb0: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7bc0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7bd0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7be0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7bf0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7c00: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7c10: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7c20: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7c30: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7c40: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7c50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7c60: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7c70: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7c80: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7c90: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7ca0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7cb0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7cc0: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7cd0: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7ce0: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7cf0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7d00: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7d10: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
7d20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7d30: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
7d40: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7d50: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
7d60: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7d70: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
7d80: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
7d90: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
7da0: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
7db0: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
7dc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7dd0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7de0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
7df0: 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b  AT, fileFormat);
7e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7e20: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7e30: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
7e40: 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20  , ENC(db));.    
7e50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7e60: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
7e70: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
7e80: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
7e90: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
7ea0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
7eb0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
7ec0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
7ed0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
7ee0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
7ef0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
7f00: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
7f10: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
7f20: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
7f30: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
7f40: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
7f50: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7f60: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
7f70: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
7f80: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
7f90: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
7fa0: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
7fb0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
7fc0: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
7fd0: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
7fe0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
7ff0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
8000: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
8010: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
8020: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
8030: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
8040: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
8050: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
8060: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8070: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
8080: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8090: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
80a0: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
80b0: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
80c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
80d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
80e0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
80f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
8100: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70  if.    {.      p
8110: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
8120: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8130: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
8140: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67  eTable, iDb, reg
8150: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
8160: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
8170: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
8180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
81a0: 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31  ewRowid, 0, reg1
81b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
81c0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
81d0: 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c  lob, 6, reg3, 0,
81e0: 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41   nullRow, P4_STA
81f0: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
8200: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8210: 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67  P_Insert, 0, reg
8220: 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  3, reg1);.    sq
8230: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8240: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
8250: 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
8260: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
8270: 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  _Close);.  }..  
8280: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
8290: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
82a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
82b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
82c0: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
82d0: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
82e0: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
82f0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
8300: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
8310: 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69  ./* Set properti
8320: 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f  es of a table co
8330: 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68  lumn based on th
8340: 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e  e (magical).** n
8350: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
8360: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
8370: 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43  _ENABLE_HIDDEN_C
8380: 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69  OLUMNS.void sqli
8390: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
83a0: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c  iesFromName(Tabl
83b0: 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20  e *pTab, Column 
83c0: 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71  *pCol){.  if( sq
83d0: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70  lite3_strnicmp(p
83e0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68  Col->zName, "__h
83f0: 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30  idden__", 10)==0
8400: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f   ){.    pCol->co
8410: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
8420: 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73  G_HIDDEN;.  }els
8430: 65 20 69 66 28 20 70 54 61 62 20 26 26 20 70 43  e if( pTab && pC
8440: 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26  ol!=pTab->aCol &
8450: 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46  & (pCol[-1].colF
8460: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48  lags & COLFLAG_H
8470: 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54  IDDEN) ){.    pT
8480: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
8490: 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20  TF_OOOHidden;.  
84a0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
84b0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
84c0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
84d0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
84e0: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
84f0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
8500: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
8510: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
8520: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
8530: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
8540: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8550: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
8560: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
8570: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
8580: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
8590: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
85a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
85b0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
85c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
85d0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
85e0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
85f0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
8600: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8610: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
8620: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
8630: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8640: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
8650: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8660: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
8670: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
8680: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
8690: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
86a0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
86b0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
86c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
86d0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
86e0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
86f0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8700: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8710: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
8720: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
8730: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
8740: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8750: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8760: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
8770: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
8780: 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  p(z, p->aCol[i].
8790: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
87a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
87b0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
87c0: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
87d0: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
87e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
87f0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
8800: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
8810: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
8820: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
8830: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
8840: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
8850: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
8860: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
8870: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
8880: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
8890: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
88a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
88b0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
88c0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
88d0: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
88e0: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
88f0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
8900: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
8910: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
8920: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
8930: 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33  e = z;.  sqlite3
8940: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
8950: 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c  FromName(p, pCol
8960: 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  );. .  /* If the
8970: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
8980: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
8990: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
89a0: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
89b0: 27 42 4c 4f 42 27 2e 20 49 66 20 74 68 65 72 65  'BLOB'. If there
89c0: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
89d0: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
89e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
89f0: 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63  ) will.  ** be c
8a00: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
8a10: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
8a20: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
8a30: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
8a40: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
8a50: 4c 4f 42 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45  LOB;.  pCol->szE
8a60: 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f  st = 1;.  p->nCo
8a70: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
8a80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8a90: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8aa0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8ab0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8ac0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8ad0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8ae0: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
8af0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
8b00: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
8b10: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
8b20: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
8b30: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
8b40: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
8b50: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8b60: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
8b70: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
8b80: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
8b90: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
8ba0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20    Table *p;.  p 
8bb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8bc0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
8bd0: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
8be0: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
8bf0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8c00: 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  1].notNull = (u8
8c10: 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  )onError;.}../*.
8c20: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
8c30: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
8c40: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
8c50: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
8c60: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
8c70: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
8c80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8c90: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
8ca0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
8cb0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
8cc0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
8cd0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
8ce0: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
8cf0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
8d00: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
8d10: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8d20: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
8d30: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
8d40: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
8d50: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
8d60: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
8d70: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
8d80: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
8d90: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
8da0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
8db0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
8dc0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
8dd0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
8de0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
8df0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
8e00: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
8e30: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
8e40: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
8e50: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
8e60: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8e70: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
8e80: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8e90: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
8ea0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
8eb0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8ec0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
8ed0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a  SQLITE_AFF_BLOB.
8ee0: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
8ef0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
8f00: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
8f10: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8f20: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
8f30: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8f40: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
8f50: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
8f60: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8f70: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
8f80: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
8f90: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
8fa0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
8fb0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
8fc0: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
8fd0: 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73   *zIn, u8 *pszEs
8fe0: 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  t){.  u32 h = 0;
8ff0: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
9000: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9010: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9020: 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66  zChar = 0;..  if
9030: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
9040: 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20  n aff;.  while( 
9050: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
9060: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
9070: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
9080: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
9090: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
90a0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
90b0: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
90c0: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
90d0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
90e0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
90f0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9100: 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a     zChar = zIn;.
9110: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9120: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
9130: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9140: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
9150: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
9160: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9170: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
9180: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
9190: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
91a0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
91b0: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
91c0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
91d0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
91e0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
91f0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9200: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
9210: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
9220: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
9230: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9240: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
9250: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
9260: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9270: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
9280: 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d       if( zIn[0]=
9290: 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a  ='(' ) zChar = z
92a0: 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  In;.#ifndef SQLI
92b0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
92c0: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
92d0: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
92e0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
92f0: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
9300: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
9310: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9320: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9330: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9340: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9350: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9360: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
9370: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
9380: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
9390: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
93a0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
93b0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
93c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
93d0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
93e0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
93f0: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
9400: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
9410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
9420: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
9430: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9440: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9450: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9460: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
9470: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
9480: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
9490: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
94a0: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
94b0: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
94c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
94d0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
94e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
94f0: 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20  /* If pszEst is 
9500: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
9510: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
9520: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
9530: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
9540: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
9550: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
9560: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
9570: 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73    */.  if( pszEs
9580: 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74  t ){.    *pszEst
9590: 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 1;   /* defau
95a0: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
95b0: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
95c0: 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f   if( aff<SQLITE_
95d0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
95e0: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
95f0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9600: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
9610: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9620: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
9630: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
9640: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20     int v = 0;.  
9650: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9660: 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c  3GetInt32(zChar,
9670: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
9680: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
9690: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
96a0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a  >255 ) v = 255;.
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a              *psz
96c0: 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42  Est = v; /* BLOB
96d0: 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c  (k), VARCHAR(k),
96e0: 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b   CHAR(k) -> r=(k
96f0: 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  /4+1) */.       
9700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9720: 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20    zChar++;.     
9730: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9740: 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73  {.        *pszEs
9750: 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42  t = 5;   /* BLOB
9760: 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20  , TEXT, CLOB -> 
9770: 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20  r=5  (approx 20 
9780: 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d  bytes)*/.      }
9790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
97a0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
97b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
97c0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
97d0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
97e0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
97f0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9800: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9810: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
9820: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
9830: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
9840: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
9850: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
9860: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
9870: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
9880: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9890: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
98a0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
98b0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
98c0: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
98d0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
98e0: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
98f0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
9900: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
9910: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
9920: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
9930: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
9940: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
9950: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
9960: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9970: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
9980: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9990: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70  lumn *pCol;..  p
99a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
99b0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
99c0: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
99d0: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
99e0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
99f0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61  [p->nCol-1];.  a
9a00: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79  ssert( pCol->zTy
9a10: 70 65 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54  pe==0 || CORRUPT
9a20: 5f 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _DB );.  sqlite3
9a30: 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
9a40: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
9a50: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
9a60: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9a70: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
9a80: 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  , pType);.  pCol
9a90: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
9aa0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9ab0: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70  (pCol->zType, &p
9ac0: 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a  Col->szEst);.}..
9ad0: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
9ae0: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
9af0: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
9b00: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9b10: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
9b20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
9b30: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9b40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
9b50: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
9b60: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
9b70: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
9b80: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
9b90: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
9ba0: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
9bb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9bc0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
9bd0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
9be0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
9bf0: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
9c00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9c10: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
9c20: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
9c30: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
9c40: 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61  , ExprSpan *pSpa
9c50: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
9c60: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
9c70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9c80: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20  pParse->db;.  p 
9c90: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9ca0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20  ble;.  if( p!=0 
9cb0: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
9cc0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
9cd0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
9ce0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
9cf0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53  antOrFunction(pS
9d00: 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e  pan->pExpr, db->
9d10: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
9d20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9d30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
9d40: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9d50: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9d60: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9d70: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9d80: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9d90: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9da0: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9db0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9dc0: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9dd0: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9de0: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9df0: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9e00: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9e10: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9e20: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9e30: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9e40: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9e50: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9e60: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9e70: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9e80: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9e90: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9ea0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
9eb0: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
9ec0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
9ed0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9ee0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
9ef0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9f00: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
9f10: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9f20: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
9f60: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9f70: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9f80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9f90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9fa0: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9fb0: 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f  .** Backwards Co
9fc0: 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b  mpatibility Hack
9fd0: 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69  :.** .** Histori
9fe0: 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  cal versions of 
9ff0: 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20  SQLite accepted 
a000: 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d  strings as colum
a010: 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e  n names in.** in
a020: 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52  dexes and PRIMAR
a030: 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
a040: 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20  s and in UNIQUE 
a050: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78  constraints.  Ex
a060: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
a070: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79   CREATE TABLE xy
a080: 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d  z(a,b,c,d,e,PRIM
a090: 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49  ARY KEY('a'),UNI
a0a0: 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c  QUE('b','c' COLL
a0b0: 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20  ATE trim).**    
a0c0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62   CREATE INDEX ab
a0d0: 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27  c ON xyz('c','d'
a0e0: 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54   DESC,'e' COLLAT
a0f0: 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a  E nocase DESC);.
a100: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f  **.** This is go
a110: 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65  ofy.  But to pre
a120: 73 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20  serve backwards 
a130: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65  compatibility we
a140: 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20   continue to.** 
a150: 61 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73  accept it.  This
a160: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
a170: 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76  e necessary conv
a180: 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76  ersion.  It conv
a190: 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72  erts.** the expr
a1a0: 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20  ession given in 
a1b0: 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f  its argument fro
a1c0: 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e  m a TK_STRING in
a1d0: 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66  to a TK_ID.** if
a1e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a1f0: 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52  is just a TK_STR
a200: 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69  ING with an opti
a210: 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61  onal COLLATE cla
a220: 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65  use..** If the e
a230: 70 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79  pxression is any
a240: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
a250: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20   TK_STRING, the 
a260: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
a270: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
a280: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
a290: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70  e3StringToId(Exp
a2a0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
a2b0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b  op==TK_STRING ){
a2c0: 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
a2d0: 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
a2e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  p->op==TK_COLLAT
a2f0: 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f  E && p->pLeft->o
a300: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a310: 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70      p->pLeft->op
a320: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a   = TK_ID;.  }.}.
a330: 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65  ./*.** Designate
a340: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a350: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
a360: 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
a370: 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66   of names .** of
a380: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f   columns that fo
a390: 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  rm the primary k
a3a0: 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  ey.  If pList is
a3b0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a   NULL, then the.
a3c0: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  ** most recently
a3d0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66   added column of
a3e0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68   the table is th
a3f0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a  e primary key..*
a400: 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e  *.** A table can
a410: 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
a420: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
a430: 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  If the table alr
a440: 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72  eady has.** a pr
a450: 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74  imary key (and t
a460: 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e  his is the secon
a470: 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74  d primary key) t
a480: 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a  hen create an.**
a490: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
a4a0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a4b0: 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20   is on a single 
a4c0: 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74  column whose dat
a4d0: 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52  atype is INTEGER
a4e0: 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c  ,.** then we wil
a4f0: 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61  l try to use tha
a500: 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20  t column as the 
a510: 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20  rowid.  Set the 
a520: 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66  Table.iPKey.** f
a530: 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c  ield of the tabl
a540: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
a550: 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69  tion to be the i
a560: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49  ndex of the.** I
a570: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a580: 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c  EY column.  Tabl
a590: 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74  e.iPKey is set t
a5a0: 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73  o -1 if there is
a5b0: 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50  .** no INTEGER P
a5c0: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a  RIMARY KEY..**.*
a5d0: 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20  * If the key is 
a5e0: 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50  not an INTEGER P
a5f0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e  RIMARY KEY, then
a600: 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65   create a unique
a610: 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68  .** index for th
a620: 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78  e key.  No index
a630: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20   is created for 
a640: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a650: 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  KEYs..*/.void sq
a660: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
a670: 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
a680: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
a690: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a6a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
a6b0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65    /* List of fie
a6c0: 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69  ld names to be i
a6d0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
a6e0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
a6f0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
a700: 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f   a uniqueness co
a710: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
a720: 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a  autoInc,      /*
a730: 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54   True if the AUT
a740: 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f  OINCREMENT keywo
a750: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
a760: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
a770: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53       /* SQLITE_S
a780: 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f  O_ASC or SQLITE_
a790: 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  SO_DESC */.){.  
a7a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
a7b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a7c0: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  .  char *zType =
a7d0: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
a7e0: 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54   -1, i;.  int nT
a7f0: 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  erm;.  if( pTab=
a800: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
a810: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
a820: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a830: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
a840: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
a850: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
a860: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a870: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
a880: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
a890: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
a8a0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
a8b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
a8c0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
a8d0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
a8e0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
a8f0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
a900: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
a910: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
a920: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
a930: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a940: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a950: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
a960: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
a970: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
a980: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a  .    nTerm = 1;.
a990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65    }else{.    nTe
a9a0: 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rm = pList->nExp
a9b0: 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  r;.    for(i=0; 
a9c0: 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nTerm; i++){. 
a9d0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70       Expr *pCExp
a9e0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
a9f0: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
aa00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
aa10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45       assert( pCE
aa20: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
aa30: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
aa40: 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20  d(pCExpr);.     
aa50: 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d   if( pCExpr->op=
aa60: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
aa70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
aa80: 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75  Name = pCExpr->u
aa90: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
aaa0: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
aab0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
aac0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
aad0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
aae0: 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62  Cmp(zCName, pTab
aaf0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ab00: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
ab10: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
ab20: 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20  [iCol].colFlags 
ab30: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
ab40: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
ab50: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
ab60: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ab80: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
ab90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
abb0: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
abc0: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
abd0: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
abe0: 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
abf0: 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51  && sortOrder!=SQ
ac00: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29  LITE_SO_DESC.  )
ac10: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
ac20: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
ac30: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
ac40: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
ac50: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
ac60: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
ac70: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
ac80: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
ac90: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
aca0: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
acb0: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
acc0: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
acd0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
ace0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
acf0: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
ad00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ad10: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
ad20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ad30: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
ad40: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
ad50: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
ad60: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
ad70: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
ad80: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
ad90: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
ada0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
adb0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
adc0: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
add0: 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  rror, 0,.       
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72      0, sortOrder
ae00: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
ae10: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64 78 54  ){.      p->idxT
ae20: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58  ype = SQLITE_IDX
ae30: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b  TYPE_PRIMARYKEY;
ae40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
ae50: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
ae60: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
ae70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ae80: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
ae90: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
aea0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
aeb0: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
aec0: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
aed0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
aee0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
aef0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
af00: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
af10: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
af20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
af30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
af40: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
af50: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
af60: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
af70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
af80: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
af90: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
afa0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
afb0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
afc0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
afd0: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
afe0: 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21  ARE_VTAB.   && !
aff0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
b000: 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64  adonly(db->aDb[d
b010: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74  b->init.iDb].pBt
b020: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ).  ){.    pTab-
b030: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
b040: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b050: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
b060: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
b070: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
b080: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b090: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
b0a0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
b0b0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
b0c0: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
b0d0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
b0e0: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
b0f0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
b100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b110: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b120: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
b130: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
b140: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
b150: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
b160: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
b170: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
b180: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
b190: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
b1a0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
b1b0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
b1c0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
b1d0: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
b1e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
b1f0: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
b200: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
b210: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
b220: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
b230: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b240: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
b250: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
b260: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
b270: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
b280: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b290: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
b2a0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
b2b0: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
b2c0: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
b2d0: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
b2e0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
b2f0: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
b300: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
b310: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b320: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
b330: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
b340: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
b350: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
b360: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
b370: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
b380: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
b390: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
b3a0: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
b3b0: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
b3c0: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
b3d0: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
b3e0: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
b3f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
b400: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
b410: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
b420: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
b430: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
b440: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b450: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b460: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b470: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
b480: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
b490: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
b4a0: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
b4b0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
b4c0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b4d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b4e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b4f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b500: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
b510: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b520: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
b530: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b540: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
b550: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
b560: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
b570: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
b580: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
b590: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
b5a0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b5b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
b5c0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
b5d0: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
b5e0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
b5f0: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
b600: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
b610: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
b620: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
b630: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
b640: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b650: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
b660: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
b670: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
b680: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
b690: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
b6a0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
b6b0: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
b6c0: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
b6d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
b6e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
b6f0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
b700: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
b710: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
b720: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
b730: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
b740: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
b750: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
b760: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
b770: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
b780: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
b790: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
b7a0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
b7b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b7c0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
b7d0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b7e0: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
b7f0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b800: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
b810: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
b820: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
b830: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
b840: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
b850: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b860: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
b870: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b880: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b890: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
b8a0: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
b8b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b8c0: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
b8d0: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
b8e0: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
b8f0: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
b900: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
b910: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
b920: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
b930: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
b940: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
b950: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
b960: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
b970: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
b980: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
b990: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
b9a0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
b9b0: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
b9c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b9d0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b9e0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
b9f0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
ba00: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
ba10: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
ba20: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
ba30: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
ba40: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
ba50: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
ba60: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
ba70: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
ba80: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
ba90: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
baa0: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
bab0: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
bac0: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
bad0: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
bae0: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
baf0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
bb00: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
bb10: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
bb20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
bb30: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
bb40: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
bb50: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
bb60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
bb70: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
bb80: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
bb90: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
bba0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
bbb0: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
bbc0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
bbd0: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
bbe0: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
bbf0: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
bc00: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
bc10: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
bc20: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
bc30: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
bc40: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
bc50: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
bc60: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
bc70: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
bc80: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
bc90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bca0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
bcb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
bcc0: 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
bcd0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
bce0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
bcf0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
bd00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
bd10: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
bd20: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
bd30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bd40: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
bd50: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48  , iDb, BTREE_SCH
bd60: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20  EMA_VERSION, .  
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
bd90: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
bda0: 6f 6f 6b 69 65 2b 31 29 3b 0a 7d 0a 0a 2f 2a 0a  ookie+1);.}../*.
bdb0: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
bdc0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
bdd0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
bde0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
bdf0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
be00: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
be10: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
be20: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
be30: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
be40: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
be50: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
be60: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
be70: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
be80: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
be90: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
bea0: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
beb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
bec0: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
bed0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
bee0: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
bef0: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
bf00: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
bf10: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
bf20: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
bf30: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
bf40: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
bf50: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
bf60: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
bf70: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
bf80: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
bf90: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
bfa0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
bfb0: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
bfc0: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
bfd0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
bfe0: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
bff0: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
c000: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
c010: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
c020: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
c030: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
c040: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
c050: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
c060: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
c070: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
c080: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
c090: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c0a0: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
c0b0: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
c0c0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
c0d0: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
c0e0: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
c0f0: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
c100: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
c110: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
c120: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
c130: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
c140: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
c150: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
c160: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
c170: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
c180: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
c190: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
c1a0: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
c1b0: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
c1c0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
c1d0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
c1e0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
c1f0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
c200: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
c210: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
c220: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
c230: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
c240: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
c250: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
c260: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
c270: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
c280: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
c290: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
c2a0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
c2b0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
c2c0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
c2d0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
c2e0: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
c2f0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
c300: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
c310: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
c320: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
c330: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
c340: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
c350: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
c360: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c370: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
c380: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
c390: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
c3a0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
c3b0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
c3c0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
c3d0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
c3e0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c3f0: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
c400: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
c410: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
c420: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
c430: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
c440: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
c450: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
c460: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
c470: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c480: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
c490: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
c4a0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
c4b0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
c4c0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
c4d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
c4e0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
c4f0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
c500: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
c510: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
c520: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
c530: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
c540: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
c550: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
c560: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
c570: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
c580: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c590: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
c5a0: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
c5b0: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
c5c0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
c5d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
c5e0: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
c5f0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
c600: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
c610: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
c620: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
c630: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
c640: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
c650: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
c660: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
c670: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
c680: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c690: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
c6a0: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
c6b0: 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
c6c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c6d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
c6e0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
c6f0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
c700: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
c710: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
c720: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
c730: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
c740: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
c750: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
c760: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
c770: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c780: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
c790: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c7a0: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
c7b0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
c7c0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20  QLITE_AFF_BLOB  
c7d0: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
c7e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
c7f0: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
c800: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
c810: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c820: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
c830: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c840: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
c850: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
c860: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
c870: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
c880: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
c890: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c8a0: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
c8b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
c8c0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
c8d0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
c8e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
c8f0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
c900: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
c910: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
c920: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
c930: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c940: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
c950: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d  LITE_AFF_BLOB >=
c960: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
c970: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c980: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
c990: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
c9a0: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
c9b0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
c9c0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c9d0: 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73  _BLOB );.    tes
c9e0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c9f0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
ca00: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
ca10: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
ca20: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
ca30: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
ca40: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
ca50: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
ca60: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
ca70: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca80: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
ca90: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
caa0: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
cab0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
cac0: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
cad0: 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20  TE_AFF_BLOB];.  
cae0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
caf0: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
cb00: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
cb10: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
cb20: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20  TE_AFF_BLOB .   
cb30: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
cb40: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
cb50: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
cb60: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
cb70: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
cb80: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
cb90: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
cba0: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
cbb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cbc0: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
cbd0: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
cbe0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
cbf0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
cc00: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
cc10: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
cc20: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
cc30: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
cc40: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
cc50: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
cc60: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
cc70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cc80: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
cc90: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
cca0: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
ccb0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
ccc0: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
ccd0: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
cce0: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
ccf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
cd00: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
cd10: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
cd20: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
cd30: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
cd40: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
cd50: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
cd60: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
cd70: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
cd80: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
cd90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
cda0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cdb0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
cdc0: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
cdd0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cde0: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
cdf0: 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a   char**)zExtra;.
ce00: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
ce10: 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d  of(char*)*N;.  m
ce20: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
ce30: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69  dx->aiColumn, si
ce40: 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e  zeof(i16)*pIdx->
ce50: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
ce60: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
ce70: 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  6*)zExtra;.  zEx
ce80: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
ce90: 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  6)*N;.  memcpy(z
cea0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f  Extra, pIdx->aSo
ceb0: 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e  rtOrder, pIdx->n
cec0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
ced0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
cee0: 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64  8*)zExtra;.  pId
cef0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a  x->nColumn = N;.
cf00: 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65    pIdx->isResize
cf10: 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d = 1;.  return 
cf20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cf30: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
cf40: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
cf50: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
cf60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
cf70: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
cf80: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
cf90: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
cfa0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
cfb0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
cfc0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
cfd0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
cfe0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cff0: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
d000: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
d010: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
d020: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
d030: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
d040: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
d050: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
d060: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
d070: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
d080: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
d090: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
d0a0: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
d0b0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
d0c0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
d0d0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
d0e0: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
d0f0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
d100: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
d110: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
d120: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
d130: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
d140: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31  mn; i++){.    i1
d150: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
d160: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
d170: 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61  ert( x<pIdx->pTa
d180: 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  ble->nCol );.   
d190: 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f   wIndex += x<0 ?
d1a0: 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e   1 : aCol[pIdx->
d1b0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45  aiColumn[i]].szE
d1c0: 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e  st;.  }.  pIdx->
d1d0: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
d1e0: 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a  e3LogEst(wIndex*
d1f0: 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  4);.}../* Return
d200: 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78   true if value x
d210: 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66   is found any of
d220: 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20   the first nCol 
d230: 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c  entries of aiCol
d240: 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  [].*/.static int
d250: 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74   hasColumn(const
d260: 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74   i16 *aiCol, int
d270: 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20   nCol, int x){. 
d280: 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e   while( nCol-- >
d290: 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69   0 ) if( x==*(ai
d2a0: 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20  Col++) ) return 
d2b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
d2c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d2d0: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
d2e0: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
d2f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
d300: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
d310: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
d320: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
d330: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
d340: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
d350: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
d360: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
d370: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
d380: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
d390: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
d3a0: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
d3b0: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
d3c0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
d3d0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
d3e0: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
d3f0: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
d400: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43  **.**     (1)  C
d410: 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72  onvert the OP_Cr
d420: 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61  eateTable into a
d430: 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  n OP_CreateIndex
d440: 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20 20  .  There is.**  
d450: 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69 64          no rowid
d460: 20 62 74 72 65 65 20 66 6f 72 20 61 20 57 49 54   btree for a WIT
d470: 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e 73  HOUT ROWID.  Ins
d480: 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69  tead, the canoni
d490: 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  cal.**          
d4a0: 64 61 74 61 20 73 74 6f 72 61 67 65 20 69 73 20  data storage is 
d4b0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
d4c0: 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28   btree..**     (
d4d0: 32 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63  2)  Bypass the c
d4e0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  reation of the s
d4f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d500: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  le entry.**     
d510: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49       for the PRI
d520: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
d530: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
d540: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
d550: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
d560: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
d570: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
d580: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
d590: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29  self..**     (3)
d5a0: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
d5b0: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
d5c0: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
d5d0: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
d5e0: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
d5f0: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
d600: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
d610: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  le..**     (4)  
d620: 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  Set all columns 
d630: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d640: 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  EY schema object
d650: 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e   to be NOT NULL.
d660: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
d670: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
d680: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
d690: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
d6a0: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
d6b0: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
d6c0: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
d6d0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
d6e0: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
d6f0: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
d700: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
d710: 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65  .nXField and are
d720: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a   not used for.**
d730: 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e            sortin
d740: 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75  g or lookup or u
d750: 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73  niqueness checks
d760: 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65  ..**     (6)  Re
d770: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20  place the rowid 
d780: 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f  tail on all auto
d790: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
d7a0: 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  ted UNIQUE.**   
d7b0: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77         indices w
d7c0: 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20  ith the PRIMARY 
d7d0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  KEY columns..*/.
d7e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
d7f0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
d800: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
d810: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d820: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
d830: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
d840: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
d850: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
d860: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d870: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
d880: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
d890: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
d8a0: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
d8b0: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  opcode that woul
d8c0: 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74  d normally creat
d8d0: 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d  e the.  ** root-
d8e0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62  page for the tab
d8f0: 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72  le into an OP_Cr
d900: 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65  eateIndex opcode
d910: 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a  .  The index.  *
d920: 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62  * created will b
d930: 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52  ecome the PRIMAR
d940: 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a  Y KEY index..  *
d950: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
d960: 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20  addrCrTab ){.   
d970: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
d980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d990: 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 61  ngeOpcode(v, pPa
d9a0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
d9b0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 29 3b  OP_CreateIndex);
d9c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
d9d0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
d9e0: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
d9f0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
da00: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
da10: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
da20: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
da30: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
da40: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
da50: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
da60: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
da70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
da80: 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f  .    Token ipkTo
da90: 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ken;.    sqlite3
daa0: 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f  TokenInit(&ipkTo
dab0: 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ken, pTab->aCol[
dac0: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
dad0: 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
dae0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
daf0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
db00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
db10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
db20: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
db30: 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b   &ipkToken, 0));
db40: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
db50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
db60: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
db70: 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Order = pParse->
db80: 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  iPkSortOrder;.  
db90: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
dba0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61  ->pNewTable==pTa
dbb0: 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  b );.    pPk = s
dbc0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
dbd0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
dbe0: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
dbf0: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
dc00: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
dc10: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  k==0 ) return;. 
dc20: 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20     pPk->idxType 
dc30: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
dc40: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
dc50: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
dc60: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
dc70: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
dc80: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
dc90: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61  b);..    /* Bypa
dca0: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
dcb0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
dcc0: 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65  EY btree and the
dcd0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
dce0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72     ** table entr
dcf0: 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  y. This is only 
dd00: 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72  required if curr
dd10: 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67  ently generating
dd20: 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64   VDBE.    ** cod
dd30: 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54  e for a CREATE T
dd40: 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70  ABLE (not when p
dd50: 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61  arsing one as pa
dd60: 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20  rt of reading.  
dd70: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
dd80: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20  schema).  */.   
dd90: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
dda0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
ddb0: 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
ddc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ddd0: 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b  ngeOpcode(v, pPk
dde0: 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29  ->tnum, OP_Goto)
ddf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
de00: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
de10: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
de20: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
de30: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
de40: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
de50: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
de60: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
de70: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
de80: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
de90: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
dea0: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
deb0: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
dec0: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
ded0: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
dee0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
def0: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
df00: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
df10: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
df20: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
df30: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
df40: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
df50: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
df60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df70: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
df80: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
df90: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
dfa0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
dfb0: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
dfc0: 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65   }.  pPk->isCove
dfd0: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65  ring = 1;.  asse
dfe0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
dff0: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
e000: 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ol;..  /* Make s
e010: 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ure every column
e020: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e030: 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e  KEY is NOT NULL.
e040: 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20    (Except,.  ** 
e050: 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  do not enforce t
e060: 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  his for imposter
e070: 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69   tables.) */.  i
e080: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
e090: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
e0a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
e0b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54  ; i++){.      pT
e0c0: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
e0d0: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75  Column[i]].notNu
e0e0: 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  ll = OE_Abort;. 
e0f0: 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e     }.    pPk->un
e100: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
e110: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f   }..  /* The roo
e120: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
e130: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
e140: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
e150: 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
e160: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
e170: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
e180: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
e190: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
e1a0: 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
e1b0: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
e1c0: 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
e1d0: 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
e1e0: 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
e1f0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e200: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
e210: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e220: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e230: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e240: 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
e250: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
e260: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
e270: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
e280: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e290: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e2a0: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e2b0: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e2c0: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e2d0: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
e2e0: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  }.    if( n==0 )
e2f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e300: 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72  index is a super
e310: 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  set of the prima
e320: 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  ry key */.      
e330: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
e340: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
e350: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
e360: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
e370: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
e380: 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  b, pIdx, pIdx->n
e390: 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75  KeyCol+n) ) retu
e3a0: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
e3b0: 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j=pIdx->nKeyCol
e3c0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e3d0: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e3e0: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e3f0: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e400: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e410: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e420: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
e430: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
e440: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  n[i];.        pI
e450: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  dx->azColl[j] = 
e460: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
e470: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e490: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e4a0: 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
e4b0: 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
e4c0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
e4d0: 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
e4e0: 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
e4f0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
e500: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
e510: 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b  x.  */.  if( nPk
e520: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
e530: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e540: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
e550: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20  , pTab->nCol) ) 
e560: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
e570: 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54  i=0, j=nPk; i<pT
e580: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
e590: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e5a0: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
e5b0: 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20  mn, j, i) ){.   
e5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
e5d0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
e5e0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e5f0: 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20  lumn[j] = i;.   
e600: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
e610: 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [j] = sqlite3Str
e620: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20  BINARY;.        
e630: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e640: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e650: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
e660: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
e670: 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20  ab->nCol==j );. 
e680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d   }else{.    pPk-
e690: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  >nColumn = pTab-
e6a0: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
e6b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e6c0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
e6d0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
e6e0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
e6f0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
e700: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
e710: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
e720: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
e730: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
e740: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
e750: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
e760: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
e770: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
e780: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
e790: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
e7a0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
e7b0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
e7c0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
e7d0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
e7e0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
e7f0: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
e800: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
e810: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
e820: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
e830: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
e840: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
e850: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
e860: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
e870: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
e880: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
e890: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
e8a0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
e8b0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
e8c0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
e8d0: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
e8e0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
e8f0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
e900: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
e910: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
e920: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
e930: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
e940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
e950: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
e960: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
e970: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
e980: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
e990: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
e9a0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
e9b0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
e9c0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
e9d0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
e9e0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
e9f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
ea00: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
ea10: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
ea20: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
ea30: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
ea40: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
ea50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ea60: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
ea70: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
ea80: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
ea90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
eaa0: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
eab0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
eac0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
ead0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
eae0: 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65     /* The ')' be
eaf0: 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  fore options in 
eb00: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
eb10: 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73   */.  u8 tabOpts
eb20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
eb30: 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74   Extra table opt
eb40: 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e  ions. Usually 0.
eb50: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
eb60: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
eb70: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
eb80: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
eb90: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
eba0: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
ebb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
ebc0: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
ebd0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ebe0: 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
ebf0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ec00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
ec30: 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65   which the table
ec40: 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65   lives */.  Inde
ec50: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
ec60: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c        /* An impl
ec70: 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  ied index of the
ec80: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
ec90: 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c   pEnd==0 && pSel
eca0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
ecb0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
ecc0: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
ecd0: 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70  ailed );.  p = p
ece0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ecf0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
ed00: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
ed10: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
ed20: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
ed30: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
ed40: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
ed50: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
ed60: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
ed70: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
ed80: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
ed90: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
eda0: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
edb0: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
edc0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
edd0: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
ede0: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
edf0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
ee00: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
ee10: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
ee20: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
ee30: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
ee40: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
ee50: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
ee60: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
ee70: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
ee80: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  **.  ** If t
ee90: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
eea0: 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d  ber is 1, that m
eeb0: 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65  eans this is the
eec0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
eed0: 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66   ** table itself
eee0: 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65  .  So mark it re
eef0: 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ad-only..  */.  
ef00: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
ef10: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
ef20: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
ef30: 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  num;.    if( p->
ef40: 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62  tnum==1 ) p->tab
ef50: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64  Flags |= TF_Read
ef60: 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  only;.  }..  /* 
ef70: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
ef80: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
ef90: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
efa0: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
efb0: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
efc0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
efd0: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
efe0: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
eff0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f000: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
f010: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
f020: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
f030: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
f040: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
f050: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
f060: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
f070: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
f080: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
f090: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f0a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
f0b0: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
f0c0: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
f0d0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
f0e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
f0f0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
f100: 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f  thoutRowid | TF_
f110: 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
f120: 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57        convertToW
f130: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
f140: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
f150: 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20   }.  }..  iDb = 
f160: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
f170: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
f180: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
f190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
f1a0: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61  .  /* Resolve na
f1b0: 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b  mes in all CHECK
f1c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72   constraint expr
f1d0: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
f1e0: 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b  if( p->pCheck ){
f1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
f200: 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
f210: 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49  (pParse, p, NC_I
f220: 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43  sCheck, 0, p->pC
f230: 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  heck);.  }.#endi
f240: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f250: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
f260: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   */..  /* Estima
f270: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72  te the average r
f280: 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20  ow size for the 
f290: 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c  table and for al
f2a0: 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65  l implied indice
f2b0: 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54  s */.  estimateT
f2c0: 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20  ableWidth(p);.  
f2d0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
f2e0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f2f0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f300: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
f310: 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a  dth(pIdx);.  }..
f320: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
f330: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
f340: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
f350: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
f360: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
f370: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
f380: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
f390: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
f3a0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
f3b0: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
f3c0: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
f3d0: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
f3e0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
f3f0: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
f400: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
f410: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
f420: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f430: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
f440: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
f450: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
f460: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
f470: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
f480: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
f490: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
f4a0: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
f4b0: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
f4c0: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
f4d0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
f4e0: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
f4f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f500: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f510: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
f520: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
f530: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f540: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
f550: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
f560: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
f570: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
f580: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
f590: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
f5a0: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
f5b0: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
f5c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
f5d0: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
f5e0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
f5f0: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
f600: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
f610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f620: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
f630: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
f640: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
f650: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
f660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f670: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
f680: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
f690: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
f6a0: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
f6b0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
f6c0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
f6d0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
f6e0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
f6f0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
f700: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
f710: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
f720: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
f730: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
f740: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
f750: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
f760: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
f770: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
f780: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
f790: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
f7a0: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
f7b0: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
f7c0: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
f7d0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
f7e0: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
f7f0: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
f800: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
f810: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
f820: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
f830: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
f840: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
f850: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
f860: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
f870: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
f880: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
f890: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
f8a0: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
f8b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
f8c0: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
f8d0: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
f8e0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
f8f0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f900: 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68  t dest;    /* Wh
f910: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ere the SELECT s
f920: 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75  hould store resu
f930: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
f940: 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20   regYield;      
f950: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
f960: 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20  ding co-routine 
f970: 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20  entry-point */. 
f980: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
f990: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  ;        /* Top 
f9a0: 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
f9b0: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
f9c0: 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  egRec;         /
f9d0: 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65  * A record to be
f9e0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65   insert into the
f9f0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
fa00: 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
fa10: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
fa20: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
fa30: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
fa40: 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c      int addrInsL
fa50: 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f  oop;    /* Top o
fa60: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69  f the loop for i
fa70: 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f  nserting rows */
fa80: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
fa90: 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20  elTab;     /* A 
faa0: 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72  table that descr
fab0: 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  ibes the SELECT 
fac0: 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20  results */..    
fad0: 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70    regYield = ++p
fae0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
faf0: 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50     regRec = ++pP
fb00: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fb10: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
fb20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fb30: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
fb40: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
fb50: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
fb60: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb80: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
fb90: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
fba0: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
fbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fbc0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
fbd0: 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20  G_P2ISREG);.    
fbe0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
fbf0: 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f   2;.      addrTo
fc00: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
fc10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
fc20: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
fc30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fc40: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
fc50: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
fc60: 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  rTop);.      sql
fc70: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
fc80: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
fc90: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
fca0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fcb0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
fcc0: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
fcd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fce0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
fcf0: 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
fd00: 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
fd10: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fd20: 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31  e(v, addrTop - 1
fd30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
fd40: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
fd50: 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  rn;.      pSelTa
fd60: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
fd70: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
fd80: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
fd90: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
fda0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fdb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
fdc0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
fdd0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
fde0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
fdf0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
fe00: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
fe10: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
fe20: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
fe30: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
fe40: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
fe50: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
fe60: 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
fe70: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
fe80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
fe90: 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
fea0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
feb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
fec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fed0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
fee0: 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
fef0: 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
ff00: 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
ff10: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
ff20: 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
ff30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff40: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
ff50: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
ff60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ff80: 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
ff90: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
ffa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
ffb0: 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  o(v, addrInsLoop
ffc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ffd0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ffe0: 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20  addrInsLoop);.  
fff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10000 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
10010 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 1);.    }..  
10020 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10030 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10040 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
10050 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
10060 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10070 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
10080 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
10090 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
100a0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
100b0 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
100c0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
100d0 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
100e0 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
100f0 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
10100 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
10110 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
10120 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
10130 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
10140 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
10150 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
10160 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
10170 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
10180 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10190 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
101a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
101b0 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
101c0 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
101d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
101e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
101f0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
10200 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
10210 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
10220 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
10230 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
10240 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
10250 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
10260 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10270 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10280 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
10290 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
102a0 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
102b0 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
102c0 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
102d0 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
102e0 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
102f0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
10300 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
10310 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
10320 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
10330 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
10340 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
10350 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
10360 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
10370 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
10380 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
10390 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
103a0 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
103b0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
103c0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
103d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
103e0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
103f0 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
10400 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
10410 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
10420 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
10430 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
10440 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
10450 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
10460 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
10470 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  if( p->tabFlags 
10480 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
10490 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nt ){.      Db *
104a0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
104b0 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Db];.      asser
104c0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
104d0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
104e0 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69  b, 0) );.      i
104f0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
10500 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
10510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
10520 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
10530 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
10540 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
10550 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
10560 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
10570 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
10580 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
10590 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
105a0 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
105b0 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
105c0 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
105d0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
105e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
105f0 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
10600 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
10610 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
10620 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61  intf(db, "tbl_na
10630 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
10640 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d  !='trigger'", p-
10650 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a  >zName));.  }...
10660 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
10670 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
10680 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
10690 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
106a0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
106b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
106c0 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
106d0 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
106e0 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
106f0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  a;.    assert( s
10700 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
10710 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
10720 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ) );.    pOld = 
10730 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
10740 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
10750 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  ash, p->zName, p
10760 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
10770 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10780 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
10790 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
107a0 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
107b0 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
107c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
107d0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
107e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
107f0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
10800 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
10810 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
10820 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
10830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10840 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
10850 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c      if( !p->pSel
10860 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ect ){.      con
10870 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
10880 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
10890 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
108a0 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n.z;.      int n
108b0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Name;.      asse
108c0 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20  rt( !pSelect && 
108d0 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b  pCons && pEnd );
108e0 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
108f0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
10900 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a    pCons = pEnd;.
10910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e        }.      nN
10920 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e  ame = (int)((con
10930 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d  st char *)pCons-
10940 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >z - zName);.   
10950 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73     p->addColOffs
10960 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65  et = 13 + sqlite
10970 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61  3Utf8CharLen(zNa
10980 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
10990 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
109a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
109b0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
109c0 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
109d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
109e0 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
109f0 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
10a00 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
10a10 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
10a20 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
10a30 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
10a40 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
10a50 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
10a60 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
10a70 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
10a80 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
10a90 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
10aa0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
10ab0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
10ac0 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
10ad0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
10ae0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
10af0 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
10b00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
10b10 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  w */.  ExprList 
10b20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74  *pCNames, /* Opt
10b30 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69  ional list of vi
10b40 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ew column names 
10b50 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
10b60 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
10b70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
10b80 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
10b90 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
10ba0 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
10bb0 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
10bc0 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
10bd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
10be0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
10bf0 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
10c00 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
10c10 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
10c20 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
10c30 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
10c40 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
10c50 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
10c60 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
10c70 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
10c80 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
10c90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10ca0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10cb0 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
10cc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10cd0 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
10ce0 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
10cf0 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
10d00 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
10d10 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71  w_fail;.  }.  sq
10d20 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
10d30 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10d40 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
10d50 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
10d60 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
10d70 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
10d80 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
10d90 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  r ) goto create_
10da0 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c  view_fail;.  sql
10db0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
10dc0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10dd0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
10de0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
10df0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
10e00 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
10e10 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
10e20 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
10e30 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
10e40 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
10e50 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
10e60 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74  , pSelect) ) got
10e70 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
10e80 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  il;..  /* Make a
10e90 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
10ea0 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
10eb0 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
10ec0 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
10ed0 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
10ee0 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
10ef0 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
10f00 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
10f10 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
10f20 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
10f30 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
10f40 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
10f50 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
10f60 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
10f70 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
10f80 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
10f90 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
10fa0 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
10fb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
10fc0 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
10fd0 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
10fe0 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71    p->pCheck = sq
10ff0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
11000 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58  (db, pCNames, EX
11010 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
11020 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11030 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65  ailed ) goto cre
11040 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
11050 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
11060 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
11070 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
11080 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
11090 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
110a0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
110b0 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
110c0 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
110d0 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  sEnd.z[0]!=0 );.
110e0 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
110f0 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
11100 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
11110 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
11120 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64    n = (int)(sEnd
11130 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b  .z - pBegin->z);
11140 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
11150 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
11160 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  z;.  while( sqli
11170 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31  te3Isspace(z[n-1
11180 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  ]) ){ n--; }.  s
11190 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
111a0 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
111b0 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
111c0 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
111d0 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
111e0 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
111f0 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
11200 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
11210 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20  e, 0, &sEnd, 0, 
11220 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77  0);..create_view
11230 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33  _fail:.  sqlite3
11240 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
11250 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c   pSelect);.  sql
11260 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11270 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b  te(db, pCNames);
11280 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e  .  return;.}.#en
11290 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
112a0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20  IT_VIEW */..#if 
112b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
112c0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
112d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
112e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
112f0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
11300 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
11310 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
11320 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
11330 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
11340 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
11350 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
11360 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
11370 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
11380 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
11390 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
113a0 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
113b0 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
113c0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
113d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
113e0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
113f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
11400 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
11410 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
11420 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62     /* A fake tab
11430 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  le from which we
11440 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   get the result 
11450 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  set */.  Select 
11460 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f  *pSel;     /* Co
11470 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
11480 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
11490 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69   the view */.  i
114a0 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
114b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
114c0 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
114d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
114e0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
114f0 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65  rarily holds the
11500 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
11510 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20  rs assigned */. 
11520 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11530 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
11540 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11550 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72  on for malloc er
11560 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rors */.  sqlite
11570 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20  3_xauth xAuth;  
11580 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41       /* Saved xA
11590 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  uth pointer */..
115a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
115b0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
115c0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
115d0 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69  TABLE.  if( sqli
115e0 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
115f0 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
11600 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
11610 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11620 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
11630 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
11640 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
11650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11660 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
11670 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
11680 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
11690 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
116a0 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
116b0 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
116c0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
116d0 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
116e0 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
116f0 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
11700 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
11710 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
11720 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
11730 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
11740 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
11750 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
11760 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
11770 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
11780 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
11790 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
117a0 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
117b0 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
117c0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
117d0 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
117e0 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
117f0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
11800 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
11810 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
11820 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
11830 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
11840 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
11850 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
11860 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
11870 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
11880 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
11890 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
118a0 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
118b0 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
118c0 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
118d0 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
118e0 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
118f0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
11900 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
11910 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
11920 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
11930 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
11940 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
11950 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
11960 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
11980 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
11990 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
119a0 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
119b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
119c0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
119d0 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
119e0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
119f0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
11a00 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
11a10 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
11a20 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
11a30 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
11a40 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11a50 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
11a60 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
11a70 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
11a80 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
11a90 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
11aa0 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
11ab0 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
11ac0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
11ad0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
11ae0 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
11af0 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
11b00 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
11b10 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
11b20 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
11b30 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
11b40 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
11b50 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
11b60 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
11b70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
11b80 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
11b90 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43    if( pTable->pC
11ba0 68 65 63 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  heck ){.    db->
11bb0 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
11bc0 6c 65 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  le++;.    sqlite
11bd0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
11be0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
11bf0 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20  ble->pCheck, .  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
11c20 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
11c30 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
11c40 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
11c50 69 73 61 62 6c 65 2d 2d 3b 0a 20 20 7d 65 6c 73  isable--;.  }els
11c60 65 7b 0a 20 20 20 20 70 53 65 6c 20 3d 20 73 71  e{.    pSel = sq
11c70 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
11c80 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
11c90 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
11ca0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20  pSel ){.      n 
11cb0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
11cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
11cd0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
11ce0 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
11cf0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 70 54 61  pSrc);.      pTa
11d00 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
11d10 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
11d20 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a  ide.bDisable++;.
11d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11d40 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11d50 4e 0a 20 20 20 20 20 20 78 41 75 74 68 20 3d 20  N.      xAuth = 
11d60 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 20  db->xAuth;.     
11d70 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
11d80 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
11d90 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
11da0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
11db0 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 64 62   pSel);.      db
11dc0 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
11dd0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 53 65  .#else.      pSe
11de0 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
11df0 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
11e00 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23  pParse, pSel);.#
11e10 65 6e 64 69 66 0a 20 20 20 20 20 20 64 62 2d 3e  endif.      db->
11e20 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
11e30 6c 65 2d 2d 3b 0a 20 20 20 20 20 20 70 50 61 72  le--;.      pPar
11e40 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
11e50 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20      if( pSelTab 
11e60 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
11e70 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
11e80 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  =0 );.        pT
11e90 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65  able->nCol = pSe
11ea0 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
11eb0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
11ec0 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
11ed0 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
11ee0 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
11ef0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
11f00 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
11f10 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
11f20 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
11f30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11f40 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11f50 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
11f60 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20  Table->pSchema) 
11f70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11f80 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
11f90 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
11fa0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
11fb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
11fc0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
11fd0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  pSel);.    } els
11fe0 65 20 7b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b  e {.      nErr++
11ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
12000 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73  able->pSchema->s
12010 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42  chemaFlags |= DB
12020 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 23  _UnresetViews;.#
12030 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12040 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
12050 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
12060 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
12070 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12080 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
12090 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
120a0 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
120b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
120c0 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
120d0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
120e0 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
120f0 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
12100 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
12110 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
12120 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
12130 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
12140 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
12150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12160 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12170 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20  b, idx, 0) );.  
12180 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
12190 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
121a0 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
121b0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
121c0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
121d0 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
121e0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
121f0 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
12200 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
12210 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12220 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
12230 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
12240 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
12250 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
12260 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
12270 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
12280 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
12290 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
122a0 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
122b0 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
122c0 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
122d0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
122e0 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
122f0 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
12300 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12310 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
12320 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12330 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
12340 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
12350 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
12360 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
12370 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
12380 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
12390 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
123a0 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
123b0 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
123c0 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
123d0 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
123e0 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
123f0 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
12400 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
12410 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
12420 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
12430 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
12440 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
12450 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
12460 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
12470 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
12480 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
12490 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
124a0 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
124b0 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
124c0 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
124d0 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
124e0 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
124f0 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
12500 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
12510 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
12520 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
12530 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
12540 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
12550 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
12560 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
12570 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
12580 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
12590 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
125a0 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
125b0 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
125c0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
125d0 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
125e0 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
125f0 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
12600 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
12610 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
12620 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
12630 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
12640 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
12650 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
12660 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
12670 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
12680 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
12690 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
126a0 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
126b0 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
126c0 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
126d0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
126e0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
126f0 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
12700 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
12710 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
12720 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12730 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12740 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
12750 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
12760 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
12770 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
12780 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
12790 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
127a0 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
127b0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
127c0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
127d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
127e0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
127f0 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
12800 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
12810 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
12820 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
12830 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
12840 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
12850 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
12860 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
12870 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
12880 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
12890 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
128a0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
128b0 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
128c0 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
128d0 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
128e0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
128f0 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
12900 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
12910 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
12920 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
12930 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
12940 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
12950 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
12960 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
12970 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
12980 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
12990 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
129a0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
129b0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
129c0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
129d0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
129e0 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
129f0 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
12a00 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
12a10 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
12a20 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
12a30 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
12a40 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
12a50 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
12a60 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
12a70 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
12a80 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12a90 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
12aa0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
12ab0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 62  ;.  assert( iTab
12ad0 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  le>1 );.  sqlite
12ae0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12af0 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
12b00 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73  e, r1, iDb);.  s
12b10 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
12b20 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
12b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12b40 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
12b50 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
12b60 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
12b70 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
12b80 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
12b90 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
12ba0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
12bb0 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
12bc0 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
12bd0 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
12be0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
12bf0 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
12c00 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
12c10 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
12c20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
12c30 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68  The "#NNN" in th
12c40 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
12c50 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
12c60 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
12c70 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e  value.  ** is in
12c80 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20   register NNN.  
12c90 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65  See grammar rule
12ca0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
12cb0 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45  h the TK_REGISTE
12cc0 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72  R.  ** token for
12cd0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
12ce0 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  rmation..  */.  
12cf0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
12d00 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
12d10 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
12d20 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
12d30 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f  HERE #%d AND roo
12d40 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20  tpage=#%d",.    
12d50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
12d60 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
12d70 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
12d80 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
12d90 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
12da0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12db0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
12dc0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
12dd0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
12de0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
12df0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
12e00 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
12e10 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
12e20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
12e30 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
12e40 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
12e50 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
12e60 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
12e70 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
12e80 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
12e90 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
12ea0 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
12eb0 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
12ec0 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
12ed0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
12ee0 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
12ef0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
12f00 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
12f10 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
12f20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12f30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12f40 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
12f50 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
12f60 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
12f70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
12f80 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73  >pSchema);.  des
12f90 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
12fa0 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  rse, pTab->tnum,
12fb0 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64   iDb);.  for(pId
12fc0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
12fd0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
12fe0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
12ff0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
13000 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
13010 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65   iDb);.  }.#else
13020 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
13030 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
13040 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
13050 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
13060 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
13070 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
13080 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
13090 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
130a0 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
130b0 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
130c0 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
130d0 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
130e0 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
130f0 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
13100 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
13110 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
13120 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
13130 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
13140 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
13150 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
13160 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
13170 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
13180 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
13190 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
131a0 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
131b0 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
131c0 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
131d0 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
131e0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
131f0 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
13200 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
13210 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
13220 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
13230 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
13240 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
13250 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
13260 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
13270 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
13280 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
13290 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
132a0 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
132b0 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
132c0 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
132d0 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
132e0 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
132f0 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
13300 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
13310 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
13320 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
13330 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
13340 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
13350 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
13360 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
13370 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
13380 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
13390 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
133a0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
133b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
133c0 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
133d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
133e0 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
133f0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
13400 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
13410 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
13420 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
13430 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
13440 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
13450 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
13460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13470 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
13480 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
13490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
134a0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
134b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
134c0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
134d0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
134e0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
134f0 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
13500 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
13510 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
13520 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
13530 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
13540 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
13550 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
13560 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
13570 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
13580 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
13590 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20  N tables (for N 
135a0 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61  in (1,2,3)).** a
135b0 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45  fter a DROP INDE
135c0 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20  X or DROP TABLE 
135d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
135e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ic void sqlite3C
135f0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a  learStatTables(.
13600 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13620 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
13630 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
13640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13650 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
13660 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
13670 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
13680 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22  * "idx" or "tbl"
13690 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
136a0 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20   *zName      /* 
136b0 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72  Name of index or
136c0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69   table */.){.  i
136d0 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
136e0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50  ar *zDbName = pP
136f0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
13700 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  b].zName;.  for(
13710 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
13720 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
13730 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
13740 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
13750 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
13760 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
13770 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
13780 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
13790 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
137a0 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
137b0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
137c0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
137d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
137e0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
137f0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
13800 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
13810 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
13820 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13830 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13840 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
13850 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
13860 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
13870 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
13880 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
13890 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
138a0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
138b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
138c0 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
138d0 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
138e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
138f0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
13900 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13910 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
13920 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
13930 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
13940 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
13950 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
13960 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13970 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
13980 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
139a0 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
139b0 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
139c0 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
139d0 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
139e0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
139f0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
13a00 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
13a10 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
13a20 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
13a30 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
13a40 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
13a50 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
13a60 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
13a70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
13a80 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
13a90 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
13aa0 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
13ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
13ac0 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
13ad0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
13ae0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
13af0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
13b00 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
13b10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
13b20 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
13b30 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
13b40 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
13b50 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
13b60 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
13b70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
13b80 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
13b90 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
13ba0 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
13bb0 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
13bc0 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
13bd0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
13be0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
13bf0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
13c00 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
13c10 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
13c20 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
13c30 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
13c40 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
13c50 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
13c60 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13c70 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
13c80 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
13c90 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
13ca0 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
13cb0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
13cc0 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
13cd0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
13ce0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
13cf0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
13d00 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
13d10 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
13d20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
13d30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
13d40 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
13d50 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53  .  /* Drop all S
13d60 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
13d70 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
13d80 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
13d90 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  to the.  ** tabl
13da0 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
13db0 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
13dc0 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
13dd0 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
13de0 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
13df0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
13e00 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
13e10 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
13e20 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70   being.  ** drop
13e30 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
13e40 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
13e50 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
13e60 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
13e70 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
13e80 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
13e90 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
13ea0 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
13eb0 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  r.  ** database.
13ec0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
13ed0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13ee0 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  e, .      "DELET
13ef0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
13f00 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
13f10 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
13f20 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  r'",.      pDb->
13f30 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
13f40 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
13f50 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
13f60 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
13f70 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13f80 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
13f90 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
13fa0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
13fb0 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
13fc0 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
13fd0 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
13fe0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
13ff0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
14000 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
14010 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
14020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14030 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
14040 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
14050 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
14060 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
14070 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
14080 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
14090 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
140a0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  0);.  sqlite3Cha
140b0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
140c0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
140d0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
140e0 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
140f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14100 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
14110 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
14120 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
14130 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
14140 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
14150 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
14160 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14170 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
14180 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
14190 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
141a0 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
141b0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
141c0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
141d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
141e0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
141f0 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
14200 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14210 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14220 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
14230 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
14240 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rr==0 );.  asser
14250 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
14260 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  1 );.  if( sqlit
14270 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
14280 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
14290 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69  _drop_table;.  i
142a0 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
142b0 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
142c0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
142d0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
142e0 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
142f0 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
14300 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
14310 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
14320 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
14330 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
14340 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
14350 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
14360 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
14370 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
14380 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14390 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
143a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
143b0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
143c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
143d0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
143e0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
143f0 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
14400 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
14410 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
14420 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
14430 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
14440 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
14450 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
14460 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
14470 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
14480 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
14490 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
144a0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
144b0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
144c0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
144d0 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
144e0 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
144f0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
14500 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14510 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14520 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
14530 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
14540 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
14550 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
14560 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14570 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
14580 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
14590 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
145a0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
145b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
145c0 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
145d0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
145e0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
145f0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
14600 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
14610 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
14620 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
14630 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
14640 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
14650 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14660 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14670 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
14680 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
14690 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
146a0 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
146b0 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
146c0 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
146d0 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
146e0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
146f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
14700 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
14710 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
14720 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
14730 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
14740 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14750 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
14760 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
14770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14780 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14790 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
147a0 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
147b0 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
147c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
147d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
147e0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
147f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
14800 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
14810 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
14820 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
14830 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
14840 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
14850 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
14860 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
14870 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
14880 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
14890 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
148a0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
148b0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
148c0 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
148d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
148e0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
148f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
14900 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
14910 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
14920 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14930 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14940 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
14950 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
14960 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
14970 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
14980 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
14990 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
149a0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
149b0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
149c0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
149d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
149e0 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
149f0 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
14a00 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
14a10 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
14a20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14a30 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
14a40 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
14a50 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
14a60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14a70 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
14a80 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
14a90 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
14aa0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
14ab0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
14ac0 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
14ad0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
14ae0 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
14af0 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
14b00 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
14b10 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
14b20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14b30 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14b40 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
14b50 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
14b60 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
14b70 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
14b80 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
14b90 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
14ba0 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
14bb0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
14bc0 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
14bd0 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
14be0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
14bf0 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  deDropTable(pPar
14c00 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69  se, pTab, iDb, i
14c10 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69  sView);.  }..exi
14c20 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
14c30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
14c40 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
14c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14c60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14c70 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
14c80 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
14c90 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
14ca0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
14cb0 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
14cc0 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
14cd0 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
14ce0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
14cf0 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
14d00 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
14d10 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
14d20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
14d30 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
14d40 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
14d50 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
14d60 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
14d70 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
14d80 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61  o (a.k.a the "pa
14d90 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70  rent" table).  p
14da0 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a  ToCol is a list.
14db0 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  ** of tables in 
14dc0 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74  the parent pTo t
14dd0 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e  able.  flags con
14de0 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
14df0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
14e00 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
14e10 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
14e20 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
14e30 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
14e40 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
14e50 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
14e60 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
14e70 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
14e80 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
14e90 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
14ea0 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
14eb0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
14ec0 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
14ed0 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  able field..**.*
14ee0 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
14ef0 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
14f00 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
14f10 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
14f20 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
14f30 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
14f40 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
14f50 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
14f60 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
14f70 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
14f80 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
14f90 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
14fa0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
14fb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
14fc0 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
14fd0 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
14fe0 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
14ff0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15000 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
15010 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
15020 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
15030 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
15040 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
15050 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
15060 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
15070 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
15080 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
15090 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
150a0 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  thms. */.){.  sq
150b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
150c0 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
150d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
150e0 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
150f0 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65  pFKey = 0;.  FKe
15100 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61  y *pNextTo;.  Ta
15110 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
15120 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
15130 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
15140 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
15150 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
15160 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
15170 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44  if( p==0 || IN_D
15180 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
15190 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
151a0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
151b0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
151c0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
151d0 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20  ( NEVER(iCol<0) 
151e0 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
151f0 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
15200 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
15210 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
15220 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15230 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
15240 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
15250 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
15260 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
15270 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
15280 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
15290 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
152a0 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
152b0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
152c0 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
152d0 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
152e0 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
152f0 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
15300 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
15310 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
15320 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
15330 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
15340 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
15350 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
15360 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
15370 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
15380 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
15390 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
153a0 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
153b0 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
153c0 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
153d0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
153e0 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d  *pFKey) + (nCol-
153f0 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  1)*sizeof(pFKey-
15400 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
15410 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
15420 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
15430 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
15440 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15450 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
15460 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
15470 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
15480 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
15490 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44  pFKey = sqlite3D
154a0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
154b0 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
154c0 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
154d0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
154e0 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
154f0 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
15500 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
15510 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
15520 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f  &pFKey->aCol[nCo
15530 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  l];.  pFKey->zTo
15540 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
15550 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
15560 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
15570 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
15580 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20  uote(z);.  z += 
15590 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
155a0 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
155b0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
155c0 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
155d0 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
155e0 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
155f0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
15600 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
15610 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
15620 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
15630 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
15640 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
15650 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
15660 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
15670 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
15680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
15690 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
156a0 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
156b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
156c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
156d0 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
156e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
156f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15700 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
15710 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
15720 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
15730 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
15740 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
15750 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
15760 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
15770 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
15780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
15790 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
157a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
157b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
157c0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
157d0 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
157e0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
157f0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
15800 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
15810 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
15820 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
15830 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
15840 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
15850 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
15860 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
15870 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  0;.  pFKey->aAct
15880 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c  ion[0] = (u8)(fl
15890 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20  ags & 0xff);    
158a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45          /* ON DE
158b0 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  LETE action */. 
158c0 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
158d0 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73  1] = (u8)((flags
158e0 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b   >> 8 ) & 0xff);
158f0 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45      /* ON UPDATE
15900 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73   action */..  as
15910 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
15920 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
15930 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20   0, p->pSchema) 
15940 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28  );.  pNextTo = (
15950 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61  FKey *)sqlite3Ha
15960 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
15970 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20  hema->fkeyHash, 
15980 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54  .      pFKey->zT
15990 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  o, (void *)pFKey
159a0 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78  .  );.  if( pNex
159b0 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20  tTo==pFKey ){.  
159c0 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
159d0 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20  t(db);.    goto 
159e0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  fk_end;.  }.  if
159f0 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20  ( pNextTo ){.   
15a00 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f   assert( pNextTo
15a10 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a  ->pPrevTo==0 );.
15a20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
15a30 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20  To = pNextTo;.  
15a40 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76    pNextTo->pPrev
15a50 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a  To = pFKey;.  }.
15a60 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
15a70 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
15a80 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
15a90 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
15aa0 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
15ab0 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
15ac0 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
15ad0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b  e3DbFree(db, pFK
15ae0 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
15af0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15b00 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
15b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
15b20 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
15b30 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
15b40 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
15b50 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a  te(db, pToCol);.
15b60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
15b70 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
15b80 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
15b90 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
15ba0 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
15bb0 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
15bc0 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
15bd0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
15be0 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
15bf0 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
15c00 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
15c10 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
15c20 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
15c30 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
15c40 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
15c50 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
15c60 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
15c70 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
15c80 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
15c90 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
15ca0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
15cb0 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
15cc0 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
15cd0 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
15ce0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
15cf0 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
15d00 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
15d10 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
15d20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15d30 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
15d40 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
15d50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
15d60 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65  ssert( isDeferre
15d70 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72  d==0 || isDeferr
15d80 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20  ed==1 ); /* EV: 
15d90 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f  R-30323-21917 */
15da0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
15db0 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66  rred = (u8)isDef
15dc0 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
15dd0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15de0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
15df0 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
15e00 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
15e10 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
15e20 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
15e30 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
15e40 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
15e50 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
15e60 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
15e70 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
15e80 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
15e90 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
15ea0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
15eb0 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
15ec0 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
15ed0 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
15ee0 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
15ef0 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
15f00 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
15f10 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
15f20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
15f30 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
15f40 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
15f50 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
15f60 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
15f70 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
15f80 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
15f90 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
15fa0 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
15fb0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
15fc0 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
15fd0 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
15fe0 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
15ff0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
16000 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
16010 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
16020 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
16030 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
16040 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
16050 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
16060 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
16070 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
16080 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
16090 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
160a0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
160b0 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
160c0 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
160d0 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
160e0 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
160f0 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
16100 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20  int iSorter;    
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16120 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  * Cursor opened 
16130 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69  by OpenSorter (i
16140 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69  f in use) */.  i
16150 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16170 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20   Address of top 
16180 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
16190 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20   addr2;         
161a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
161b0 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74  ddress to jump t
161c0 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61  o for next itera
161d0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e  tion */.  int tn
161e0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
161f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
16200 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a   page of index *
16210 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78  /.  int iPartIdx
16220 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Label;          
16230 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68     /* Jump to th
16240 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70  is label to skip
16250 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65   a row */.  Vdbe
16260 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
16270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
16280 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
16290 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
162a0 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  chine */.  KeyIn
162b0 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20  fo *pKey;       
162c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
162d0 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a  Info for index *
162e0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
162f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16300 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
16310 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64  olding assembled
16320 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
16330 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16340 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
16350 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
16360 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16370 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
16380 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
16390 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
163a0 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
163b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
163c0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
163d0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
163e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
163f0 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
16400 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
16410 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
16420 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
16430 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
16440 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
16450 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
16460 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
16470 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
16480 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
16490 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
164a0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
164b0 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
164c0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
164d0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
164e0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
164f0 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
16500 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
16510 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
16520 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
16530 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
16540 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b  ->tnum;.  }.  pK
16550 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
16560 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
16570 65 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  e, pIndex);..  /
16580 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
16590 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
165a0 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
165b0 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
165c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
165d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
165e0 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
165f0 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
16600 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
16610 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20   (char*).       
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16630 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16640 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Key), P4_KEYINFO
16650 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
16660 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68  e table. Loop th
16670 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f  rough all rows o
16680 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73  f the table, ins
16690 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a  erting index.  *
166a0 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74  * records into t
166b0 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
166c0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
166d0 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
166e0 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
166f0 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
16700 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16710 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
16720 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65  , iTab, 0); Vdbe
16730 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72  Coverage(v);.  r
16740 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
16750 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16760 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
16770 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
16780 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
16790 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
167a0 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
167b0 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
167c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
167d0 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
167e0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
167f0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
16800 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
16810 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
16820 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
16830 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16840 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
16850 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
16860 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
16870 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16880 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
16890 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
168a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
168b0 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
168c0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
168d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
168e0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
168f0 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
16900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16910 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
16920 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
16930 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16940 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
16950 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
16960 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
16970 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
16980 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
16990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
169a0 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
169b0 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
169c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 73 73  verage(v);.  ass
169d0 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20  ert( pKey!=0 || 
169e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
169f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
16a00 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71   );.  if( IsUniq
16a10 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
16a20 26 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20  && pKey!=0 ){.  
16a30 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
16a40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16a50 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71  r(v) + 3;.    sq
16a60 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
16a70 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20   j2);.    addr2 
16a80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16a90 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
16aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ab0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74  p4Int(v, OP_Sort
16ac0 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74  erCompare, iSort
16ad0 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72  er, j2, regRecor
16ae0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
16af0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
16b00 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  ex->nKeyCol); Vd
16b10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16b20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
16b30 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
16b40 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e  e, OE_Abort, pIn
16b50 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  dex);.  }else{. 
16b60 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16b70 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16b80 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  r(v);.  }.  sqli
16b90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16ba0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
16bb0 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
16bc0 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c  rd, iIdx);.  sql
16bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16be0 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c  , OP_Last, iIdx,
16bf0 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74   0, -1);.  sqlit
16c00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16c10 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
16c20 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  dx, regRecord, 0
16c30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16c40 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
16c50 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
16c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
16c70 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16c80 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
16c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ca0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
16cb0 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
16cc0 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
16cd0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16ce0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16cf0 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
16d00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16d10 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
16d20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16d30 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
16d40 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
16d50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16d60 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
16d70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
16d80 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
16d90 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
16da0 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
16db0 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
16dc0 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
16dd0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
16de0 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
16df0 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
16e00 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
16e10 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
16e20 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
16e30 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
16e40 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
16e50 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
16e60 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
16e70 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
16e80 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
16e90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
16ea0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
16eb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16ec0 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
16ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
16ee0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
16ef0 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
16f00 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
16f10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
16f20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16f30 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
16f40 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
16f50 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
16f60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
16f70 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
16f80 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
16f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16fa0 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
16fb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16fc0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
16fd0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
16fe0 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
16ff0 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
17000 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
17010 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
17020 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
17030 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
17040 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
17050 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
17060 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
17070 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17080 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
17090 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
170a0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
170b0 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
170c0 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
170d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
170e0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
170f0 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
17100 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
17110 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17130 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
17140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17150 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
17160 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
17170 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
17180 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
17190 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
171a0 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
171b0 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
171c0 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
171d0 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
171e0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70   (const char**)p
171f0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
17200 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
17210 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
17220 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
17230 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
17240 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
17250 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17260 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
17270 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
17280 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
17290 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
172a0 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
172b0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
172c0 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
172d0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
172e0 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
172f0 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
17300 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
17310 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
17320 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
17330 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
17340 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
17350 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
17360 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
17370 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
17380 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
17390 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
173a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
173b0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
173c0 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
173d0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
173e0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
173f0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
17400 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
17410 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
17420 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
17430 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
17440 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
17450 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
17460 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
17470 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17480 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
17490 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
174a0 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
174b0 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
174c0 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
174d0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
174e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
174f0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
17500 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
17510 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
17520 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
17530 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
17540 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
17550 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
17560 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
17570 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
17580 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
17590 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
175a0 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  ction.  .**.** I
175b0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
175c0 72 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75  reated successfu
175d0 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  lly, return a po
175e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
175f0 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74   Index.** struct
17600 75 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ure. This is use
17610 64 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50  d by sqlite3AddP
17620 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d  rimaryKey() to m
17630 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ark the index.**
17640 20 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70   as the tables p
17650 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65  rimary key (Inde
17660 78 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  x.idxType==SQLIT
17670 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
17680 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a  YKEY).*/.Index *
17690 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
176a0 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
176b0 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
176c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
176d0 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
176e0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
176f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
17700 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
17710 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
17720 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
17730 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
17740 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
17750 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
17760 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
17770 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
17780 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
17790 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
177a0 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
177b0 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
177c0 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
177d0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
177e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
177f0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
17800 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
17810 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
17820 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
17830 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
17840 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
17850 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
17860 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
17870 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
17880 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
17890 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
178a0 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
178b0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
178c0 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
178d0 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
178e0 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
178f0 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
17900 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
17910 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
17920 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
17930 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52  /.){.  Index *pR
17940 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  et = 0;     /* P
17950 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e  ointer to return
17960 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
17970 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
17980 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
17990 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
179a0 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
179b0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
179c0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
179d0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
179e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
179f0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
17a00 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
17a10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
17a20 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
17a30 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
17a40 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
17a50 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
17a60 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
17a70 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
17a80 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
17a90 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
17aa0 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
17ab0 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
17ac0 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
17ad0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
17ae0 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17b00 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
17b10 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17b20 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
17b30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
17b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17b50 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
17b60 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
17b70 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
17b80 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
17b90 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
17ba0 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
17bb0 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
17bc0 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
17bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
17be0 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
17bf0 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
17c00 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
17c10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17c20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
17c30 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
17c40 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
17c50 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
17c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17c70 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
17c80 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
17c90 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
17ca0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17cb0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
17cc0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17cd0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
17ce0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
17cf0 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
17d00 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
17d10 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
17d20 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
17d30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
17d40 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
17d50 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
17d60 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
17d70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17d80 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
17d90 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
17da0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
17db0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17dc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17dd0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
17de0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
17df0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17e00 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
17e10 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
17e20 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
17e30 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
17e40 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
17e50 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
17e60 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
17e70 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
17e80 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
17e90 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
17ea0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
17eb0 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
17ec0 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
17ed0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
17ee0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17ef0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
17f00 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
17f10 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17f20 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17f30 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
17f40 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
17f50 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
17f60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
17f70 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
17f80 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
17f90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17fa0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
17fb0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
17fc0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
17fd0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
17fe0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
17ff0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
18000 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
18010 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
18020 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
18030 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
18040 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
18050 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
18060 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18070 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
18080 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
18090 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
180a0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
180b0 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
180c0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
180d0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
180e0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
180f0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
18100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
18110 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
18120 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
18130 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
18140 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
18150 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18160 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
18170 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
18180 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
18190 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
181a0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
181b0 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
181c0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
181d0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
181e0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
181f0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
18200 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
18210 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
18220 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
18230 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
18240 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
18250 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
18260 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
18270 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
18280 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
18290 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
182a0 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
182b0 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
182c0 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
182d0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
182e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
182f0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
18300 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
18310 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
18320 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
18330 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
18340 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
18350 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
18360 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18370 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18380 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
18390 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
183a0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
183b0 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
183c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
183d0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
183e0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
183f0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
18400 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
18410 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
18420 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18430 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
18440 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
18450 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
18460 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
18470 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
18480 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
18490 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
184a0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
184b0 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
184c0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
184d0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
184e0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
184f0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
18500 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
18510 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
18520 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
18530 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
18540 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
18550 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
18560 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
18570 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
18580 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
18590 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
185a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
185b0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
185c0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
185d0 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
185e0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
185f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18600 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
18610 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
18620 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
18630 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
18640 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18650 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
18660 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
18670 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18680 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18690 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
186a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
186b0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
186c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
186d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
186e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
186f0 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
18700 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
18710 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18720 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18730 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
18740 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
18750 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
18760 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
18770 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18780 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
18790 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
187a0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
187b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
187c0 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
187d0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
187e0 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
187f0 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
18800 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
18810 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
18820 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
18830 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
18840 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
18850 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
18860 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
18870 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
18880 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
18890 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
188a0 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
188b0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
188c0 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
188d0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
188e0 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
188f0 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
18900 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
18910 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18920 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
18930 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
18940 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
18950 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
18960 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
18970 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
18980 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18990 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
189a0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
189b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
189c0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
189d0 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
189e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
189f0 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
18a00 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
18a10 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
18a20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18a30 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
18a40 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18a50 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
18a60 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
18a70 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
18a80 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
18a90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18aa0 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
18ab0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
18ac0 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
18ad0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
18ae0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18af0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
18b00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18b10 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
18b20 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
18b30 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
18b40 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
18b50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18b60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18b70 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
18b80 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
18b90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
18ba0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
18bb0 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
18bc0 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
18bd0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
18be0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
18bf0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
18c00 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18c10 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
18c30 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
18c40 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
18c50 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
18c60 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
18c70 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
18c80 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
18c90 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
18ca0 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
18cb0 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
18cc0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
18cd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
18ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
18cf0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18d00 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
18d10 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
18d20 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
18d30 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
18d40 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
18d50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
18d60 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
18d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
18d80 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
18d90 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18da0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18db0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
18dc0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
18dd0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
18de0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18df0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18e00 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
18e10 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
18e20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
18e30 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
18e40 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
18e50 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
18e60 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18e70 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
18e80 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
18e90 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18ea0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18eb0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18ed0 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
18ee0 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
18ef0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
18f00 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
18f10 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
18f20 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
18f30 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
18f40 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
18f50 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
18f60 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
18f70 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
18f80 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
18f90 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
18fa0 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
18fb0 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
18fc0 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 54  nit(&prevCol, pT
18fd0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
18fe0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
18ff0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
19000 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
19010 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
19020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19030 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
19040 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
19050 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
19060 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
19070 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19080 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
19090 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
190a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
190b0 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
190c0 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29  List, sortOrder)
190d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
190e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
190f0 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
19100 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22  , pList, "index"
19110 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  );.  }..  /* Fig
19120 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
19130 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
19140 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
19150 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
19160 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
19170 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19180 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
19190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
191a0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
191b0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
191c0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
191d0 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
191e0 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
191f0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
19200 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
19210 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
19220 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
19230 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
19240 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
19250 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
19260 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
19270 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
19280 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
19290 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
192a0 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
192b0 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
192c0 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78  ol : 1;.  pIndex
192d0 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61   = sqlite3Alloca
192e0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  teIndexObject(db
192f0 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  , pList->nExpr +
19300 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20   nExtraCol,.    
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61    nName + nExtra
19340 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a   + 1, &zExtra);.
19350 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19360 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
19370 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19380 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
19390 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
193a0 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
193b0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b  >aiRowLogEst) );
193c0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
193d0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
193e0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20  pIndex->azColl) 
193f0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
19400 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a  me = zExtra;.  z
19410 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b  Extra += nName +
19420 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e   1;.  memcpy(pIn
19430 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
19440 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
19450 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
19460 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
19470 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
19480 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
19490 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
194a0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b  nError!=OE_None;
194b0 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  .  pIndex->idxTy
194c0 70 65 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c  pe = pName ? SQL
194d0 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
194e0 45 46 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54  EF : SQLITE_IDXT
194f0 59 50 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49  YPE_UNIQUE;.  pI
19500 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
19510 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
19520 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
19530 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
19540 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
19550 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
19560 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
19570 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
19580 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
19590 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
195a0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
195b0 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
195c0 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
195d0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
195e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
195f0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
19600 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
19610 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
19620 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
19630 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
19640 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
19650 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
19660 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
19670 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
19680 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
19690 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
196a0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
196b0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
196c0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
196d0 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
196e0 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
196f0 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
19700 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
19710 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
19720 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
19730 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
19740 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
19750 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
19760 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
19770 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
19780 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
19790 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
197a0 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
197b0 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
197c0 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
197d0 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
197e0 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
197f0 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
19800 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
19810 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
19820 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
19830 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
19840 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
19850 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
19860 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
19870 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
19880 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
19890 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
198a0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
198b0 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
198c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
198d0 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
198e0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
198f0 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
19900 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  ){.    Expr *pCE
19910 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
19920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
19930 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  h index expressi
19940 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  on */.    int re
19950 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
19960 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20  ;        /* ASC 
19970 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69  or DESC on the i
19980 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
19990 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
199a0 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
199b0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
199c0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
199d0 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  */..    sqlite3S
199e0 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49  tringToId(pListI
199f0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
19a00 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
19a10 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
19a20 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64  rse, pTab, NC_Id
19a30 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d  xExpr, pListItem
19a40 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->pExpr, 0);.   
19a50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19a60 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
19a70 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19a80 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
19a90 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
19aa0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19ab0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70  );.    if( pCExp
19ac0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
19ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
19ae0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
19af0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
19b00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19b10 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73  (pParse, "expres
19b20 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
19b30 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
19b40 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  and ".          
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f        "UNIQUE co
19b70 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
19b80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19b90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19ba0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
19bb0 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d  Index->aColExpr=
19bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
19bd0 70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20  prList *pCopy = 
19be0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
19bf0 75 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29  up(db, pList, 0)
19c00 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
19c10 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f  ->aColExpr = pCo
19c20 70 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  py;.        if( 
19c30 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19c40 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  d ){.          a
19c50 73 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20  ssert( pCopy!=0 
19c60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69  );.          pLi
19c70 73 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d  stItem = &pCopy-
19c80 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
19c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
19ca0 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
19cb0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
19cc0 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b  mn[i] = XN_EXPR;
19cd0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75  .      pIndex->u
19ce0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
19cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d00 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f   j = pCExpr->iCo
19d10 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  lumn;.      asse
19d20 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
19d30 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29  .      if( j<0 )
19d40 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54  {.        j = pT
19d50 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
19d60 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
19d70 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
19d80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
19d90 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
19da0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ll = 0;.      }.
19db0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
19dc0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
19dd0 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  )j;.    }.    zC
19de0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  oll = 0;.    if(
19df0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
19e00 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
19e10 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
19e20 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
19e30 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
19e40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
19e50 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
19e60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
19e70 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
19e80 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
19e90 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
19ea0 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
19eb0 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
19ec0 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
19ed0 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
19ee0 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
19ef0 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
19f00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a  .    }else if( j
19f10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  >=0 ){.      zCo
19f20 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
19f30 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].zColl;.    }.
19f40 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
19f50 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
19f60 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69  StrBINARY;.    i
19f70 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
19f80 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
19f90 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
19fa0 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
19fb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19fc0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
19fd0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
19fe0 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
19ff0 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
1a000 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
1a010 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
1a020 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
1a030 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a040 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
1a050 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
1a060 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  r;.  }..  /* App
1a070 65 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65  end the table ke
1a080 79 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  y to the end of 
1a090 74 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20  the index.  For 
1a0a0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
1a0b0 2a 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  ** tables (when 
1a0c0 70 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk!=0) this wil
1a0d0 6c 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65  l be the declare
1a0e0 64 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  d PRIMARY KEY.  
1a0f0 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  For.  ** normal 
1a100 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1a110 3d 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  ==0) this will b
1a120 65 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a  e the rowid..  *
1a130 2f 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  /.  if( pPk ){. 
1a140 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
1a150 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
1a160 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
1a170 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
1a180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1a190 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  x>=0 );.      if
1a1a0 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64  ( hasColumn(pInd
1a1b0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  ex->aiColumn, pI
1a1c0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78  ndex->nKeyCol, x
1a1d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1a1e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1a1f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a200 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1a210 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20  Column[i] = x;. 
1a220 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1a230 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e  zColl[i] = pPk->
1a240 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  azColl[j];.     
1a250 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
1a260 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e  Order[i] = pPk->
1a270 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20  aSortOrder[j];. 
1a280 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
1a290 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1a2a0 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d  sert( i==pIndex-
1a2b0 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65  >nColumn );.  }e
1a2c0 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  lse{.    pIndex-
1a2d0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1a2e0 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e  N_ROWID;.    pIn
1a2f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a300 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a310 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  Y;.  }.  sqlite3
1a320 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
1a330 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
1a340 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
1a350 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
1a360 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
1a370 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
1a380 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
1a390 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
1a3a0 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
1a3b0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
1a3c0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
1a3d0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
1a3e0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
1a3f0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1a400 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
1a410 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
1a420 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
1a430 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1a440 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
1a450 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
1a460 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
1a470 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
1a480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
1a490 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
1a4a0 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
1a4b0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
1a4c0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
1a4d0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
1a4e0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
1a4f0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
1a500 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
1a510 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
1a520 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
1a530 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
1a540 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
1a550 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
1a560 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
1a570 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1a580 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
1a590 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
1a5a0 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
1a5b0 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
1a5c0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
1a5d0 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
1a5e0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1a5f0 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
1a600 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1a610 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
1a620 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
1a630 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
1a640 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
1a650 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
1a660 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
1a670 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
1a680 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1a690 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
1a6a0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
1a6b0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
1a6c0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
1a6d0 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
1a6e0 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
1a6f0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
1a700 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
1a710 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
1a720 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
1a730 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
1a740 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
1a750 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
1a760 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1a770 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1a780 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
1a790 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1a7a0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
1a7b0 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1a7c0 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20  x(pIdx) );.     
1a7d0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
1a7e0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1a7f0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b  DXTYPE_APPDEF );
1a800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1a810 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
1a820 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  dex) );..      i
1a830 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  f( pIdx->nKeyCol
1a840 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  !=pIndex->nKeyCo
1a850 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1a860 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1a870 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b  Idx->nKeyCol; k+
1a880 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
1a890 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
1a8a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a8b0 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  z2;.        asse
1a8c0 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
1a8d0 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[k]>=0 );.    
1a8e0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
1a8f0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
1a900 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
1a910 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a920 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
1a930 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
1a940 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1a950 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
1a960 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
1a970 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1a980 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1a990 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1a9a0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1a9b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1a9c0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1a9d0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1a9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1a9f0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1aa00 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1aa10 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1aa20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1aa30 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1aa40 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1aa50 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1aa60 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1aa70 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1aa80 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1aa90 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1aaa0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1aab0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1aac0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1aad0 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1aae0 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1aaf0 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1ab00 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1ab10 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1ab20 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1ab30 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1ab40 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1ab50 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1ab60 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1ab70 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1ab80 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1ab90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1aba0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1abb0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1abc0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1abd0 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1abe0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1abf0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ac00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ac10 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1ac20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1ac30 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1ac40 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1ac50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1ac60 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1ac70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1ac80 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1ac90 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1aca0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1acb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1acc0 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 49 64        pRet = pId
1acd0 78 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  x;.        goto 
1ace0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1acf0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
1ad00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
1ad10 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
1ad20 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
1ad30 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
1ad40 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
1ad50 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
1ad60 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
1ad70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1ad80 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
1ad90 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1ada0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
1adb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1adc0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1add0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
1ade0 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
1adf0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
1ae00 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65  ashInsert(&pInde
1ae10 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
1ae20 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1ae50 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
1ae60 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
1ae70 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1ae80 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1ae90 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1aea0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
1aeb0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20  ault(db);.      
1aec0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1aed0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1aee0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
1aef0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
1af00 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
1af10 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1af20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1af30 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1af40 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
1af50 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1af60 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45  e initial CREATE
1af70 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1af80 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c   (or CREATE TABL
1af90 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  E if the.  ** in
1afa0 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65  dex is an implie
1afb0 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e  d index for a UN
1afc0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1afd0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  KEY constraint) 
1afe0 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63  then.  ** emit c
1aff0 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ode to allocate 
1b000 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61  the index rootpa
1b010 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d  ge on disk and m
1b020 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
1b030 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
1b040 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
1b050 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
1b060 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
1b070 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74  x with.  ** cont
1b080 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
1b090 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
1b0a0 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
1b0b0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
1b0c0 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
1b0d0 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1b0e0 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1b0f0 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1b100 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1b110 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1b120 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1b130 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
1b140 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1b150 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
1b160 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d  nerated as an im
1b170 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45  plied PRIMARY KE
1b180 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  Y.  ** or UNIQUE
1b190 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41   index in a CREA
1b1a0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1b1b0 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
1b1c0 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
1b1d0 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
1b1e0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
1b1f0 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
1b200 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1b210 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
1b220 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
1b230 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52  .  else if( HasR
1b240 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1b250 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1b260 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
1b270 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
1b280 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
1b290 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
1b2a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b2b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
1b2c0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
1b2d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b2e0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ;..    sqlite3Be
1b2f0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1b300 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1b310 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
1b320 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1b330 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1b340 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1b350 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  But before.    *
1b360 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1b370 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1b380 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1b390 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1b3a0 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1b3b0 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1b3c0 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1b3d0 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1b3e0 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41   a .    ** PRIMA
1b3f0 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74  RY KEY and the t
1b400 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  able is actually
1b410 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1b420 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20   table. In .    
1b430 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65  ** that case the
1b440 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
1b450 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f  tRowidTable() ro
1b460 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61  utine will repla
1b470 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f  ce.    ** the No
1b480 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74  op with a Goto t
1b490 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
1b4a0 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61  VDBE code genera
1b4b0 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20  ted below. */.  
1b4c0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1b4d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b4e0 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
1b4f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
1b510 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d  teIndex, iDb, iM
1b520 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  em);..    /* Gat
1b530 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1b540 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1b550 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1b560 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
1b570 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1b580 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
1b590 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1b5a0 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
1b5b0 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1b5c0 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
1b5d0 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
1b5e0 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  Token.n;.      i
1b5f0 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d  f( pName->z[n-1]
1b600 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ==';' ) n--;.   
1b610 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1b620 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1b630 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1b640 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1b650 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1b660 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1b670 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1b680 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
1b690 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1b6a0 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1b6b0 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1b6c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b6d0 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
1b6e0 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
1b6f0 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
1b700 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1b710 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
1b720 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1b730 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
1b740 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
1b750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1b760 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1b770 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1b780 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1b790 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
1b7a0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1b7b0 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
1b7c0 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1b7d0 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1b7e0 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1b7f0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1b800 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
1b810 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
1b820 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1b830 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
1b840 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1b850 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
1b860 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
1b870 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b880 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
1b890 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1b8a0 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1b8b0 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1b8c0 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1b8d0 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
1b8e0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1b8f0 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1b900 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
1b910 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1b920 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1b930 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1b940 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
1b950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1b960 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1b970 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1b980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1b990 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1b9a0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  Db,.         sql
1b9b0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1b9c0 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1b9d0 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1b9e0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1b9f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ba00 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70  AddOp1(v, OP_Exp
1ba10 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ire, 0);.    }..
1ba20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1ba30 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65  umpHere(v, pInde
1ba40 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20  x->tnum);.  }.. 
1ba50 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1ba60 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1ba70 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1ba80 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1ba90 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1baa0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1bab0 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1bac0 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1bad0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1bae0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1baf0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1bb00 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1bb10 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1bb20 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1bb30 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1bb40 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1bb50 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1bb60 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1bb70 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1bb80 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1bb90 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1bba0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1bbb0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1bbc0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1bbd0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1bbe0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1bbf0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1bc00 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1bc10 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1bc20 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1bc30 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1bc40 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1bc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1bc60 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1bc70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1bc80 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1bc90 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1bca0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1bcb0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1bcc0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1bcd0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1bce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1bcf0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1bd00 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1bd10 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1bd20 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1bd30 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
1bd40 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1bd50 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1bd60 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1bd70 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1bd80 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1bd90 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1bda0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1bdb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1bdc0 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1bdd0 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1bde0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1bdf0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1be00 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1be10 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1be20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1be30 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
1be40 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1be50 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1be60 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1be70 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1be80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1be90 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1bea0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1beb0 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1bec0 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1bed0 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1bee0 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1bef0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1bf00 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1bf10 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1bf20 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1bf30 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1bf40 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1bf50 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1bf60 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1bf70 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1bf80 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1bf90 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1bfa0 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1bfb0 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1bfc0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1bfd0 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1bfe0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1bff0 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1c000 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1c010 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1c020 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1c030 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1c040 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1c050 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1c060 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1c070 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1c080 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1c090 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1c0a0 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1c0b0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1c0c0 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1c0d0 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1c0e0 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1c0f0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1c100 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1c110 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1c120 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1c130 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1c140 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1c150 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1c160 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1c170 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1c180 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1c190 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1c1a0 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1c1b0 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1c1d0 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1c1e0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1c1f0 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1c200 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1c210 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1c220 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1c230 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1c240 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1c250 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1c260 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1c270 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1c280 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1c290 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1c2a0 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1c2b0 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1c2c0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c2d0 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66  table. Or 10, if
1c2e0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
1c2f0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20  umber of rows . 
1c300 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65   ** in the table
1c310 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1c320 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d  at.  */.  a[0] =
1c330 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1c340 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1c350 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1c360 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73  = 33;        ass
1c370 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33  ert( 33==sqlite3
1c380 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20  LogEst(10) );.. 
1c390 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61   /* Estimate tha
1c3a0 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b  t a[1] is 10, a[
1c3b0 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73  2] is 9, a[3] is
1c3c0 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61   8, a[4] is 7, a
1c3d0 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e  [5] is.  ** 6 an
1c3e0 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  d each subsequen
1c3f0 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29  t value (if any)
1c400 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d   is 5.  */.  mem
1c410 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c  cpy(&a[1], aVal,
1c420 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f   nCopy*sizeof(Lo
1c430 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  gEst));.  for(i=
1c440 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78  nCopy+1; i<=pIdx
1c450 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1c460 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20  .    a[i] = 23; 
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73     assert( 23==s
1c490 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20  qlite3LogEst(5) 
1c4a0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1c4b0 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
1c4c0 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49  st(1) );.  if( I
1c4d0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1c4e0 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  x) ) a[pIdx->nKe
1c4f0 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  yCol] = 0;.}../*
1c500 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c510 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
1c520 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
1c530 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
1c540 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
1c550 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
1c560 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
1c570 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
1c580 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1c590 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
1c5a0 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
1c5b0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c5c0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
1c5d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1c5e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1c5f0 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1c600 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1c610 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
1c620 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
1c630 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
1c640 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c650 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1c660 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1c670 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
1c680 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
1c690 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1c6a0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1c6b0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
1c6c0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1c6d0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
1c6e0 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1c6f0 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
1c700 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
1c710 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1c720 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
1c730 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
1c740 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
1c750 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c760 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1c770 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
1c780 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
1c790 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1c7a0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1c7b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
1c7c0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1c7d0 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  abase);.    }.  
1c7e0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1c7f0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
1c800 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1c810 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
1c820 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
1c830 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1c840 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c  PPDEF ){.    sql
1c850 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c860 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
1c870 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
1c880 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
1c890 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1c8a0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1c8b0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
1c8c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1c8d0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
1c8e0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1c8f0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
1c900 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
1c910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c920 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1c930 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1c940 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1c950 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
1c960 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
1c970 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
1c980 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1c990 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1c9a0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1c9b0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1c9c0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1c9d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1c9e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1c9f0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1ca00 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1ca10 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1ca20 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1ca30 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1ca40 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1ca50 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1ca60 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1ca70 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ca80 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1ca90 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1caa0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1cab0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1cac0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1cad0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1cae0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1caf0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1cb00 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1cb10 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1cb20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1cb30 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1cb40 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1cb50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1cb60 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1cb70 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1cb80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1cb90 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1cba0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1cbb0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1cbc0 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1cbd0 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1cbe0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1cbf0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1cc00 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
1cc10 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
1cc20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
1cc30 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
1cc40 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
1cc50 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
1cc60 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1cc70 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1cc80 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
1cc90 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
1cca0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
1ccb0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1ccc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ccd0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
1cce0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
1ccf0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
1cd00 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
1cd10 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1cd20 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
1cd30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
1cd40 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
1cd50 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
1cd60 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a  bjects. Each obj
1cd70 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
1cd80 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
1cd90 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
1cda0 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20  is routine uses 
1cdb0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cdc0 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20  ().** to extend 
1cdd0 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61  the array so tha
1cde0 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65  t there is space
1cdf0 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63   for a new objec
1ce00 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  t at the end..**
1ce10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
1ce20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ce30 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61  , *pnEntry conta
1ce40 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ins the current 
1ce50 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61  size of.** the a
1ce60 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73  rray (in entries
1ce70 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61   - so the alloca
1ce80 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74  tion is ((*pnEnt
1ce90 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62  ry) * szEntry) b
1cea0 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c  ytes.** in total
1ceb0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1cec0 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63  realloc() is suc
1ced0 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66  cessful (i.e. if
1cee0 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   no OOM conditio
1cef0 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a  n occurs), the.*
1cf00 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * space allocate
1cf10 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62  d for the new ob
1cf20 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20  ject is zeroed, 
1cf30 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64  *pnEntry updated
1cf40 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74   to.** reflect t
1cf50 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
1cf60 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70  he array and a p
1cf70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1cf80 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  w allocation.** 
1cf90 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20  returned. *pIdx 
1cfa0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
1cfb0 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61  dex of the new a
1cfc0 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68  rray entry in th
1cfd0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  is case..**.** O
1cfe0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1cff0 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73   realloc() fails
1d000 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  , *pIdx is set t
1d010 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72  o -1, *pnEntry r
1d020 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e  emains.** unchan
1d030 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ged and a copy o
1d040 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65  f pArray returne
1d050 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1d060 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1d070 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d080 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1d090 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1d0a0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1d0b0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
1d0c0 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
1d0d0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
1d0e0 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
1d0f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
1d100 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
1d110 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
1d120 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
1d130 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
1d140 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d150 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
1d160 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
1d170 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
1d180 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1d190 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
1d1a0 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
1d1b0 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
1d1c0 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1d1d0 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1d1e0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  0 ){.    int sz 
1d1f0 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32  = (n==0) ? 1 : 2
1d200 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  *n;.    void *pN
1d210 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1d220 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
1d230 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  , sz*szEntry);. 
1d240 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1d250 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
1d260 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d270 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
1d280 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
1d290 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1d2a0 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
1d2b0 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74  set(&z[n * szEnt
1d2c0 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
1d2d0 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20  ;.  *pIdx = n;. 
1d2e0 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72   ++*pnEntry;.  r
1d2f0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a  eturn pArray;.}.
1d300 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1d310 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1d320 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
1d330 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
1d340 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
1d350 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
1d360 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
1d370 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1d380 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1d390 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
1d3a0 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73  e3IdListAppend(s
1d3b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1d3c0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1d3d0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74   *pToken){.  int
1d3e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1d3f0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1d400 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1d410 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1d420 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1d430 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d440 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1d450 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1d460 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1d470 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1d480 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1d490 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1d4a0 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1d4b0 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1d4c0 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1d4d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1d4e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d4f0 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1d500 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1d510 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1d520 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1d530 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1d540 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1d550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1d560 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1d570 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1d580 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1d590 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1d5a0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1d5b0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d5c0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1d5d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1d5e0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1d5f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1d600 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1d610 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1d620 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1d630 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1d640 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1d650 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d660 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1d670 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1d680 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1d690 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1d6a0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1d6b0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1d6c0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1d6d0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1d6e0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1d6f0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1d700 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1d710 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1d720 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1d730 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1d740 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1d750 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1d760 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1d770 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1d780 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1d790 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1d7a0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1d7b0 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1d7c0 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1d7d0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1d7e0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1d7f0 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1d800 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1d810 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1d820 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1d830 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1d840 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1d850 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1d860 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1d870 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1d880 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1d890 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1d8a0 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1d8b0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1d8c0 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1d8d0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1d8e0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1d8f0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1d900 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1d910 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1d920 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1d930 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1d940 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1d950 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1d960 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1d970 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1d980 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1d990 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1d9a0 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1d9b0 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1d9c0 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1d9d0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1d9e0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1d9f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1da00 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1da10 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1da20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1da30 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1da40 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1da50 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1da60 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1da70 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1da80 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1da90 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1daa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1dab0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1dac0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1dad0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1dae0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1daf0 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1db00 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1db10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1db20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1db30 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1db40 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1db50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1db60 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1db70 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1db80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1db90 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1dba0 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1dbb0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1dbc0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1dbd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1dbe0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1dbf0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1dc00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1dc10 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1dc20 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1dc30 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1dc40 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1dc50 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1dc60 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1dc70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1dc80 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1dc90 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1dca0 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1dcb0 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1dcc0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1dcd0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1dce0 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1dcf0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1dd00 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1dd10 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1dd20 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1dd30 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1dd40 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1dd50 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1dd60 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1dd70 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1dd80 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1dd90 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1dda0 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1ddb0 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1ddc0 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1ddd0 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1dde0 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1ddf0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1de00 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1de10 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1de20 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1de30 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1de40 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1de50 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1de60 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1de70 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1de80 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1de90 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1dea0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1deb0 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1dec0 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1ded0 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1dee0 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1def0 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1df00 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1df10 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1df20 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1df30 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1df40 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1df50 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1df60 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1df70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1df80 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1df90 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1dfa0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1dfb0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1dfc0 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1dfd0 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1dfe0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1dff0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1e000 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1e010 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1e020 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1e030 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1e040 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1e050 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1e060 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1e070 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1e080 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1e090 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1e0a0 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1e0b0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1e0c0 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1e0d0 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1e0e0 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1e0f0 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1e100 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1e110 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1e120 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1e130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e140 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1e150 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1e160 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1e170 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1e180 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1e190 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1e1a0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1e1b0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1e1c0 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1e1d0 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1e1e0 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1e1f0 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1e200 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1e210 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1e220 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1e230 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1e240 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1e250 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1e260 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1e270 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1e280 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1e290 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1e2a0 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1e2b0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1e2c0 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1e2d0 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1e2e0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1e2f0 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1e300 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1e310 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1e320 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1e330 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e340 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1e350 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1e360 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e370 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1e380 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1e390 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1e3a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1e3b0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1e3c0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1e3d0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1e3e0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1e3f0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1e400 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1e410 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1e420 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1e430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1e440 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1e450 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1e460 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1e470 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1e480 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1e490 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1e4a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e4b0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1e4c0 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1e4d0 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1e4e0 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1e4f0 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1e500 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1e510 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1e520 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1e530 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1e540 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1e550 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1e560 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1e570 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1e580 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1e590 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1e5a0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1e5b0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1e5c0 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1e5d0 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1e5e0 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1e5f0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1e600 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1e610 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1e620 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1e630 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1e640 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1e650 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e660 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1e670 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1e680 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1e690 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1e6a0 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69  without B */.  i
1e6b0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1e6c0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1e6d0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
1e6e0 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
1e6f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1e700 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1e710 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
1e720 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69  loc = 1;.    pLi
1e730 73 74 2d 3e 6e 53 72 63 20 3d 20 30 3b 0a 20 20  st->nSrc = 0;.  
1e740 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1e750 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1e760 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1e770 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1e780 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e790 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1e7a0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1e7b0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1e7c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e7d0 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1e7e0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1e7f0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1e800 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1e810 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1e820 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1e830 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1e840 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1e850 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1e860 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1e870 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1e880 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1e890 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1e8a0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1e8b0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1e8c0 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1e8d0 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1e8e0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1e8f0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1e900 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1e910 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1e920 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1e930 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1e940 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1e950 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1e960 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1e970 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1e980 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1e990 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1e9a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e9b0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1e9c0 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1e9d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1e9e0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1e9f0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1ea00 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1ea10 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1ea20 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ea30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ea40 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1ea50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ea60 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1ea70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1ea80 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1ea90 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1eaa0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1eab0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1eac0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1ead0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1eae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eaf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1eb00 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1eb10 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1eb20 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1eb30 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1eb40 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1eb50 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1eb60 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1eb70 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1eb80 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1eb90 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1eba0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1ebb0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1ebc0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1ebd0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ebe0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1ebf0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ec00 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1ec10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1ec20 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1ec30 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1ec40 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1ec50 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1ec60 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1ec70 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69  IndexedBy ) sqli
1ec80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ec90 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1eca0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  By);.    if( pIt
1ecb0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1ecc0 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
1ecd0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1ece0 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
1ecf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1ed00 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1ed10 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1ed20 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1ed30 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1ed40 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1ed50 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ed60 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1ed70 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1ed80 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1ed90 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1eda0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1edb0 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1edc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1edd0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1ede0 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1edf0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1ee00 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1ee10 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1ee20 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1ee30 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1ee40 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1ee50 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1ee60 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1ee70 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1ee80 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1ee90 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1eea0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1eeb0 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1eec0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1eed0 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1eee0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1eef0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1ef00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ef10 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1ef20 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1ef30 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ef40 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1ef50 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1ef60 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1ef70 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20  the term has an 
1ef80 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1ef90 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1efa0 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1efb0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1efc0 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1efd0 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1efe0 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1eff0 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1f000 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1f010 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1f020 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1f030 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1f040 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1f050 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1f060 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1f070 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1f080 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1f090 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1f0a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1f0b0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1f0c0 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1f0d0 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1f0e0 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1f0f0 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1f100 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f110 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1f120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1f130 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1f140 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1f150 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1f160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1f170 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1f180 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1f190 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1f1a0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1f1b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1f1c0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1f1d0 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1f1e0 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1f1f0 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1f200 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1f210 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1f220 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1f230 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1f240 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1f250 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1f260 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1f270 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1f280 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1f290 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1f2a0 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1f2b0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1f2c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f2e0 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1f2f0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1f300 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1f310 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1f320 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1f330 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1f340 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f350 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1f360 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1f370 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1f380 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1f390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f3a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1f3b0 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1f3c0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1f3d0 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1f3e0 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1f3f0 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1f400 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1f410 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1f420 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f430 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1f440 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1f450 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1f460 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1f470 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1f480 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1f490 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1f4a0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1f4b0 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1f4c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1f4d0 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1f4e0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1f4f0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f500 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1f510 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1f520 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1f530 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1f540 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1f550 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1f560 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1f570 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1f580 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1f590 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1f5a0 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1f5b0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1f5c0 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1f5d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1f5e0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1f5f0 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1f600 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1f610 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1f620 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1f630 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1f640 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1f650 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1f660 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1f670 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1f680 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1f690 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1f6a0 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1f6b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1f6c0 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1f6d0 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1f6e0 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1f6f0 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1f700 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1f710 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1f720 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f730 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1f740 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1f750 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
1f760 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
1f770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f780 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1f790 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
1f7a0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1f7b0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
1f7c0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1f7d0 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1f7e0 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1f7f0 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1f800 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1f810 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1f820 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1f830 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1f840 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1f850 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1f860 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
1f870 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1f880 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1f890 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1f8a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f8b0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1f8c0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1f8d0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
1f8e0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d 20 28  .isIndexedBy = (
1f8f0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1f900 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  edBy!=0);.    }.
1f910 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
1f920 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
1f930 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
1f940 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
1f950 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
1f960 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
1f970 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1f980 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
1f990 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
1f9a0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
1f9b0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1f9c0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1f9d0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f9e0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1f9f0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1fa00 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1fa10 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
1fa20 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1fa30 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
1fa40 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
1fa50 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1fa60 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
1fa70 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
1fa80 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
1fa90 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
1faa0 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
1fab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1fac0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1fad0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
1fae0 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
1faf0 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1fb00 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1fb10 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1fb20 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1fb30 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1fb40 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1fb50 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1fb60 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1fb70 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1fb80 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1fb90 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1fba0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1fbb0 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1fbc0 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1fbd0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1fbe0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1fbf0 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1fc00 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1fc10 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1fc20 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1fc30 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1fc40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1fc50 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1fc60 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1fc70 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1fc80 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1fc90 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1fca0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1fcb0 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1fcc0 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1fcd0 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1fce0 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1fcf0 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1fd00 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1fd10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1fd20 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1fd30 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1fd40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1fd50 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1fd60 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1fd70 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1fd80 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1fd90 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1fda0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1fdb0 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
1fdc0 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
1fdd0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
1fde0 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
1fdf0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1fe00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1fe10 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
1fe20 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1fe30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fe40 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
1fe50 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1fe60 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
1fe70 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1fe80 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
1fe90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1fea0 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
1feb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
1fec0 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
1fed0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1fee0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1fef0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1ff00 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
1ff10 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1ff20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1ff30 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1ff40 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
1ff50 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
1ff60 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
1ff70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1ff80 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1ff90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ffa0 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
1ffb0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
1ffc0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
1ffd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ffe0 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
1fff0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
20000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20010 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p0(v, OP_AutoCom
20020 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  mit);.}../*.** G
20030 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
20040 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 73  e for a COMMIT s
20050 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
20060 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
20070 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
20080 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
20090 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
200a0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
200b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
200c0 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
200d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
200e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
200f0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
20100 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  MIT", 0, 0) ){. 
20110 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
20120 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
20130 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
20140 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
20150 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
20160 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
20170 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
20180 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
20190 6f 64 65 20 66 6f 72 20 61 20 52 4f 4c 4c 42 41  ode for a ROLLBA
201a0 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  CK statement..*/
201b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
201c0 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
201d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
201e0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
201f0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20210 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
20220 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20230 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20240 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20250 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
20260 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
20270 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
20280 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20290 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
202a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
202b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
202c0 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
202d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
202e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
202f0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
20300 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
20310 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
20320 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
20330 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
20340 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
20350 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20360 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
20370 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
20380 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
20390 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
203a0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
203b0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
203c0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
203d0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
203e0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
203f0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
20400 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20410 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
20420 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
20430 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
20440 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
20450 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
20460 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
20470 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
20480 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
20490 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
204a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
204b0 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
204c0 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
204d0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
204e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
204f0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
20500 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
20510 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20520 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
20530 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
20540 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
20550 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20560 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
20570 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
20580 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
20590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
205a0 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
205b0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
205c0 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
205d0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
205e0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
205f0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
20600 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
20610 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
20620 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
20630 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
20640 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
20650 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
20660 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20670 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
20680 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
20690 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
206a0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
206b0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
206c0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
206d0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
206e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
206f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
20700 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20710 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
20720 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20730 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
20740 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
20750 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
20760 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
20770 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
20780 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
20790 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
207a0 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
207b0 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
207c0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
207d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
207e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
207f0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
20800 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
20810 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
20820 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
20830 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
20840 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
20850 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
20860 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
20870 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
20880 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
20890 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
208a0 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
208b0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
208c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
208d0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
208e0 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
208f0 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
20900 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
20910 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
20920 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20930 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
20940 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
20950 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
20960 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
20970 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
20980 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
20990 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
209a0 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
209b0 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
209c0 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
209d0 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
209e0 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
209f0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
20a00 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
20a10 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
20a20 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
20a30 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
20a40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
20a50 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
20a60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20a70 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
20a80 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20a90 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20aa0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
20ab0 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
20ac0 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  evel->db;..  ass
20ad0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
20ae0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
20af0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
20b00 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
20b10 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Db==1 );.  asser
20b20 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
20b30 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
20b40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20b50 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
20b60 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
20b70 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
20b80 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
20b90 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
20ba0 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
20bb0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
20bc0 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
20bd0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
20be0 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
20bf0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
20c00 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
20c10 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  kie;.    if( !OM
20c20 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
20c30 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
20c40 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
20c50 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
20c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
20c70 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
20c80 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
20c90 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
20ca0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
20cb0 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
20cc0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
20cd0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
20ce0 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
20cf0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
20d00 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
20d10 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
20d20 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
20d30 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
20d40 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
20d50 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20d60 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
20d70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
20d80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20d90 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
20da0 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
20db0 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
20dc0 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
20dd0 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
20de0 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
20df0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
20e00 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
20e10 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
20e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
20e30 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
20e40 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
20e50 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
20e60 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
20e70 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
20e80 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
20e90 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
20ea0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
20eb0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
20ec0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
20ed0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
20ee0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
20ef0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
20f00 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
20f10 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
20f20 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
20f30 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
20f40 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
20f50 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
20f60 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
20f70 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
20f80 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
20f90 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
20fa0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
20fb0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
20fc0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
20fd0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
20fe0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
20ff0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
21000 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
21010 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
21020 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
21030 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
21040 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
21050 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
21060 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
21070 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
21080 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
21090 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
210a0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
210b0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
210c0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
210d0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
210e0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
210f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21100 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
21110 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
21120 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
21130 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
21140 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
21150 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21160 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
21170 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
21180 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
21190 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
211a0 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
211b0 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
211c0 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
211d0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
211e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
211f0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
21200 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
21210 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
21220 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
21230 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
21240 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
21250 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
21260 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
21270 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
21280 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
21290 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
212a0 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
212b0 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
212c0 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
212d0 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
212e0 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
212f0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
21300 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
21310 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
21320 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
21330 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
21340 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
21350 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
21360 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21370 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21380 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
21390 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
213a0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
213b0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
213c0 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
213d0 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
213e0 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
213f0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
21400 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
21410 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
21420 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
21430 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
21440 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
21450 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
21460 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
21470 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
21480 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
21490 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
214a0 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
214b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
214c0 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
214d0 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
214e0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
214f0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
21500 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
21510 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
21520 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
21530 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
21540 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
21550 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
21560 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
21570 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
21580 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
21590 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
215a0 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
215b0 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
215c0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
215d0 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
215e0 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
215f0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
21600 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
21610 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
21620 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
21630 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
21640 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
21650 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
21660 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
21670 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
21680 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
21690 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
216a0 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
216b0 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
216c0 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
216d0 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
216e0 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
216f0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
21700 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
21710 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
21720 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
21730 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
21740 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21750 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21760 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
21770 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
21780 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
21790 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
217a0 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
217b0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
217c0 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
217d0 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
217e0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
217f0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
21800 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
21810 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
21820 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
21830 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
21840 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
21850 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
21860 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21870 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
21880 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
21890 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
218a0 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
218b0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
218c0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
218d0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
218e0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
218f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
21900 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
21910 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
21920 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
21930 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
21940 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
21950 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
21960 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
21970 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
21980 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
21990 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
219a0 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
219b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
219c0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
219d0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
219e0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
219f0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
21a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21a10 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
21a20 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
21a30 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
21a40 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
21a50 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29  eP5(v, p5Errmsg)
21a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
21a70 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
21a80 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
21a90 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
21aa0 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f  nt violation..*/
21ab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
21ac0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  queConstraint(. 
21ad0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21ae0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
21af0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
21b00 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
21b10 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
21b20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
21b30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
21b40 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72  dex that trigger
21b50 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
21b60 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
21b70 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Err;.  int j;.  
21b80 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b  StrAccum errMsg;
21b90 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
21ba0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a   pIdx->pTable;..
21bb0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21bc0 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70  mInit(&errMsg, p
21bd0 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c  Parse->db, 0, 0,
21be0 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64   200);.  if( pId
21bf0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
21c00 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
21c10 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65  f(&errMsg, "inde
21c20 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a  x '%q'", pIdx->z
21c30 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
21c40 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
21c50 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  Idx->nKeyCol; j+
21c60 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
21c70 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  zCol;.      asse
21c80 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
21c90 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[j]>=0 );.    
21ca0 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
21cb0 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
21cc0 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  mn[j]].zName;.  
21cd0 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69      if( j ) sqli
21ce0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
21cf0 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c  d(&errMsg, ", ",
21d00 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
21d10 65 33 58 50 72 69 6e 74 66 28 26 65 72 72 4d 73  e3XPrintf(&errMs
21d20 67 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  g, "%s.%s", pTab
21d30 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
21d40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72      }.  }.  zErr
21d50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
21d60 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
21d70 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
21d80 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
21d90 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
21da0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
21db0 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
21dc0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
21df0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
21e00 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
21e10 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
21e20 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
21e30 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
21e40 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
21e50 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
21e60 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
21e70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
21e80 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
21e90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
21ea0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
21eb0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
21ec0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
21ed0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
21ee0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
21ef0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
21f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
21f10 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
21f20 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
21f30 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
21f40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
21f50 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
21f60 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
21f70 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
21f80 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
21f90 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
21fc0 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
21fd0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
21fe0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
21ff0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
22000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
22010 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
22020 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
22030 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
22040 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
22050 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
22060 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
22070 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
22080 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
22090 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
220a0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
220d0 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
220e0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
220f0 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
22100 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
22110 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
22120 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
22130 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
22140 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
22150 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
22160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
22170 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
22180 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
22190 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
221a0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
221b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
221c0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
221d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
221e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
221f0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
22200 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
22210 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
22220 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
22230 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
22240 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
22250 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
22260 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
22270 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
22280 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
22290 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
222a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
222b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
222c0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
222d0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
222e0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
222f0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
22300 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
22310 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
22320 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
22330 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
22340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22350 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
22360 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
22370 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
22380 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
22390 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
223a0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
223c0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
223d0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
223e0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
223f0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
22400 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
22410 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
22420 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
22430 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
22440 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
22450 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
22460 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
22470 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
22480 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
22490 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
224a0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
224b0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
224c0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
224d0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
224e0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
224f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
22500 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
22510 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
22520 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
22530 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
22540 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
22550 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
22560 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
22570 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
22580 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
22590 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
225a0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
225b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
225c0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
225d0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
225e0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
225f0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
22600 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
22610 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
22620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22630 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
22640 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22670 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
22680 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
22690 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
226a0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
226b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
226c0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
226d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
226e0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
226f0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
22700 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22720 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
22730 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
22740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
22750 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
22760 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e  xes(db) );  /* N
22770 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61  eeded for schema
22780 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72   access */.  for
22790 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
227a0 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
227b0 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
227c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
227d0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
227e0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
227f0 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
22800 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
22810 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
22820 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
22830 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
22840 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
22850 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
22860 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
22870 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
22880 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
22890 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
228a0 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
228b0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
228c0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228e0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
228f0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
22900 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
22910 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
22920 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
22930 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
22940 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
22950 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
22960 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
22970 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
22980 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
22990 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
229a0 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
229b0 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
229c0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
229d0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
229e0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
229f0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
22a00 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
22a10 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
22a20 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
22a30 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
22a40 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
22a50 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
22a60 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22a70 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
22a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22a90 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
22aa0 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
22ab0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22ac0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
22ad0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
22ae0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b00 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
22b10 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
22b20 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
22b30 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b50 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
22b60 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
22b70 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
22b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22b90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22ba0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
22bb0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
22bc0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
22bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
22be0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
22bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22c00 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
22c10 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
22c20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22c50 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
22c60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22c70 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
22c80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
22c90 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
22ca0 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
22cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22cc0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
22cd0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
22ce0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
22cf0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
22d00 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
22d10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
22d20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
22d30 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
22d40 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
22d50 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
22d60 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
22d70 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
22d80 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
22d90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22da0 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
22db0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
22dc0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
22dd0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
22de0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
22df0 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c  VER(pName2==0) |
22e00 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
22e10 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
22e20 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  l;.    assert( p
22e30 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
22e40 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
22e50 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
22e60 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29  rse->db, pName1)
22e70 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  ;.    if( !zColl
22e80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
22e90 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
22ea0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
22eb0 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
22ec0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
22ed0 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
22ee0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
22ef0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
22f00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22f10 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
22f20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
22f30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22f40 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
22f50 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
22f60 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
22f70 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
22f80 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
22f90 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
22fa0 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
22fb0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
22fc0 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  db, pObjName);. 
22fd0 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
22fe0 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
22ff0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
23000 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
23010 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
23020 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
23030 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
23040 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
23050 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
23060 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
23070 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
23080 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
23090 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
230a0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
230b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
230c0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
230d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
230e0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
230f0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
23100 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
23110 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
23120 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
23130 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
23140 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23150 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
23160 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
23170 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
23180 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
23190 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
231a0 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
231b0 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
231c0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
231d0 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
231e0 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f  *.** The KeyInfo
231f0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61   structure for a
23200 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63 68 65  n index is cache
23210 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20 6f  d in the Index o
23220 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65  bject..** So the
23230 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74  re might be mult
23240 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
23250 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  to the returned 
23260 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a  pointer.  The.**
23270 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
23280 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66 79  ot try to modify
23290 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
232a0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ect..**.** The c
232b0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
232c0 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
232d0 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
232e0 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
232f0 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
23300 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
23310 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
23320 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
23330 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
23340 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
23350 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
23360 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
23370 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65  olumn;.  int nKe
23380 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  y = pIdx->nKeyCo
23390 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
233a0 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ey;.  if( pParse
233b0 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
233c0 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75  0;.  if( pIdx->u
233d0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
233e0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
233f0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
23400 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
23410 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  Col-nKey);.  }el
23420 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  se{.    pKey = s
23430 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
23440 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
23450 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Col, 0);.  }.  i
23460 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
23470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
23480 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
23490 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f  (pKey) );.    fo
234a0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
234b0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
234c0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
234d0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
234e0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
234f0 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71  l[i] = zColl==sq
23500 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f  lite3StrBINARY ?
23510 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20   0 :.           
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
23530 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
23540 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
23550 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
23560 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
23570 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
23580 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
23590 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
235a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
235b0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
235c0 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30  ;.      pKey = 0
235d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
235e0 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69  turn pKey;.}..#i
235f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23600 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  T_CTE./* .** Thi
23610 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
23620 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54  oked once per CT
23630 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  E by the parser 
23640 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20  while parsing a 
23650 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e  .** WITH clause.
23660 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74   .*/.With *sqlit
23670 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72  e3WithAdd(.  Par
23680 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
23690 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
236a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74  context */.  Wit
236b0 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
236c0 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
236d0 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72   WITH clause, or
236e0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
236f0 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
23700 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
23710 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a  e common-table *
23720 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
23730 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f  rglist,     /* O
23740 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e  ptional column n
23750 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65  ame list for the
23760 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
23770 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20  ct *pQuery      
23780 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65      /* Query use
23790 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
237a0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
237b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
237c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69  pParse->db;.  Wi
237d0 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72  th *pNew;.  char
237e0 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43   *zName;..  /* C
237f0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54  heck that the CT
23800 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  E name is unique
23810 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54   within this WIT
23820 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a  H clause. If.  *
23830 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20  * not, store an 
23840 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
23850 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  se structure. */
23860 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
23870 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
23880 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
23890 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
238a0 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  && pWith ){.    
238b0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
238c0 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
238d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
238e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
238f0 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e  p(zName, pWith->
23900 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
23910 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23920 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23930 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54  , "duplicate WIT
23940 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73  H table name: %s
23950 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
23960 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
23970 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
23980 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
23990 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73  eof(*pWith) + (s
239a0 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31  izeof(pWith->a[1
239b0 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65  ]) * pWith->nCte
239c0 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  );.    pNew = sq
239d0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
239e0 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29  b, pWith, nByte)
239f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23a00 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
23a10 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
23a20 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20  zeof(*pWith));. 
23a30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e   }.  assert( (pN
23a40 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d  ew!=0 && zName!=
23a50 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
23a60 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28  Failed );..  if(
23a70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23a80 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
23a90 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
23aa0 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20  b, pArglist);.  
23ab0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
23ac0 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79  elete(db, pQuery
23ad0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
23ae0 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
23af0 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74  .    pNew = pWit
23b00 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
23b10 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
23b20 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51  te].pSelect = pQ
23b30 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  uery;.    pNew->
23b40 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43  a[pNew->nCte].pC
23b50 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a  ols = pArglist;.
23b60 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
23b70 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20  ->nCte].zName = 
23b80 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d  zName;.    pNew-
23b90 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
23ba0 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
23bb0 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20  pNew->nCte++;.  
23bc0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  }..  return pNew
23bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
23be0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
23bf0 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
23c00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23c10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
23c20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
23c30 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  thDelete(sqlite3
23c40 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74   *db, With *pWit
23c50 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20  h){.  if( pWith 
23c60 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23c70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
23c80 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
23c90 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65        struct Cte
23ca0 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d   *pCte = &pWith-
23cb0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
23cc0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23cd0 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f  te(db, pCte->pCo
23ce0 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ls);.      sqlit
23cf0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
23d00 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
23d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23d20 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d  DbFree(db, pCte-
23d30 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
23d40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23d50 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d  (db, pWith);.  }
23d60 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
23d70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23d80 54 5f 43 54 45 29 20 2a 2f 0a                    T_CTE) */.