/ Hex Artifact Content
Login

Artifact dad9c5ef0208c265cfa337627e1dc157e7f0f9d8ff2446ce71c8ee26bfc3c253:


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 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2e80: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2e90: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
2ea0: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
2eb0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
2ec0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  ated using.    *
2ed0: 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63  * CREATE, then c
2ee0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
2ef0: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
2f00: 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   an virtual tabl
2f10: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61  e that.    ** ca
2f20: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
2f30: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
2f40: 20 2a 2f 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a   */.    Module *
2f50: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
2f60: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2f70: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e  &db->aModule, zN
2f80: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ame);.    if( pM
2f90: 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  od==0 && sqlite3
2fa0: 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d 65 2c  _strnicmp(zName,
2fb0: 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29 3d 3d   "pragma_", 7)==
2fc0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 20  0 ){.      pMod 
2fd0: 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 56  = sqlite3PragmaV
2fe0: 74 61 62 52 65 67 69 73 74 65 72 28 64 62 2c 20  tabRegister(db, 
2ff0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3000: 20 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71    if( pMod && sq
3010: 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f  lite3VtabEponymo
3020: 75 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72  usTableInit(pPar
3030: 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20  se, pMod) ){.   
3040: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
3050: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 7d 0a 23  pEpoTab;.    }.#
3060: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 66  endif.    if( (f
3070: 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f  lags & LOCATE_NO
3080: 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ERR)==0 ){.     
3090: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
30a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
30b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
30c0: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
30d0: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
30e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3100: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3110: 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a  %s: %s", zMsg, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
3130: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
3140: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
3150: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
3160: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
3170: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
3180: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
3190: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
31a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
31b0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31c0: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
31d0: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
31e0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
31f0: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
3200: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
3210: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
3220: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
3230: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
3240: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
3250: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
3260: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
3270: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
3280: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
3290: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
32a0: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
32b0: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
32c0: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
32d0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
32e0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
32f0: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
3300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
3310: 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73    u32 flags,.  s
3320: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3330: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
3340: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
3350: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
3360: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3370: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3380: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3390: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
33a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
33b0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
33c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
33d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
33e0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
33f0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3400: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
3410: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
3420: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3430: 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67  ble(pParse, flag
3440: 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  s, p->zName, zDb
3450: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
3460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
3470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
3490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
34a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
34b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
34c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
34d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
34e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
34f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
3500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
3510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
3520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
3530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
3540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
3550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
3560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
3570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
3580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
3590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
35a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
35b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
35c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
35d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
35e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
35f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
3610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
3620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
3630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
3640: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
3650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
3660: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
3670: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
3680: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f   0;.  int i;.  /
3690: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
36a0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
36b0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
36c0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
36d0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
36e0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
36f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
3700: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
3710: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
3720: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
3730: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
3740: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
3750: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
3760: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
3770: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
3780: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3790: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
37a0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
37b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
37c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
37d0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
37e0: 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f  ].zDbSName) ) co
37f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
3800: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3810: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
3820: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
3830: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
3840: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
3850: 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  h, zName);.    i
3860: 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20  f( p ) break;.  
3870: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
3880: 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74  ./*.** Reclaim t
3890: 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  he memory used b
38a0: 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76 6f  y an index.*/.vo
38b0: 69 64 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e  id sqlite3FreeIn
38c0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
38d0: 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e   Index *p){.#ifn
38e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
38f0: 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65  ANALYZE.  sqlite
3900: 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70  3DeleteIndexSamp
3910: 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64  les(db, p);.#end
3920: 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  if.  sqlite3Expr
3930: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
3940: 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20  artIdxWhere);.  
3950: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3960: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f  elete(db, p->aCo
3970: 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lExpr);.  sqlite
3980: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
3990: 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70  ColAff);.  if( p
39a0: 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71  ->isResized ) sq
39b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
39c0: 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c  (void *)p->azCol
39d0: 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
39e0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
39f0: 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65  R_STAT4.  sqlite
3a00: 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45  3_free(p->aiRowE
3a10: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  st);.#endif.  sq
3a20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a30: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
3a40: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
3a50: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
3a60: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
3a70: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
3a80: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
3a90: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
3aa0: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
3ab0: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
3ac0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
3ad0: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
3ae0: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
3af0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
3b00: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
3b10: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
3b20: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
3b30: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
3b40: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3b50: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
3b60: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3b70: 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  dex;.  Hash *pHa
3b80: 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  sh;..  assert( s
3b90: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3ba0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
3bb0: 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  ) );.  pHash = &
3bc0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
3bd0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20  hema->idxHash;. 
3be0: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
3bf0: 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
3c00: 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b  h, zIdxName, 0);
3c10: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
3c20: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28  ndex) ){.    if(
3c30: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3c40: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
3c50: 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
3c60: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
3c70: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3c90: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
3ca0: 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
3cb0: 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20  on of ALWAYS(); 
3cc0: 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   The index must 
3cd0: 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  be on the list o
3ce0: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63  f.      ** indic
3cf0: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d  es. */.      p =
3d00: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3d10: 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
3d20: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20  hile( ALWAYS(p) 
3d30: 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e  && p->pNext!=pIn
3d40: 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  dex ){ p = p->pN
3d50: 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  ext; }.      if(
3d60: 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e   ALWAYS(p && p->
3d70: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29  pNext==pIndex) )
3d80: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65  {.        p->pNe
3d90: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3da0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
3db0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65  }.    sqlite3Fre
3dc0: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3dd0: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44  x);.  }.  db->mD
3de0: 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
3df0: 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d  _SchemaChange;.}
3e00: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72  ../*.** Look thr
3e10: 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66  ough the list of
3e20: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
3e30: 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b  iles in db->aDb[
3e40: 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20  ] and if.** any 
3e50: 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64  have been closed
3e60: 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  , remove them fr
3e70: 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65  om the list.  Re
3e80: 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20  allocate the.** 
3e90: 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74  db->aDb[] struct
3ea0: 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72  ure to a smaller
3eb0: 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62   size, if possib
3ec0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20  le..**.** Entry 
3ed0: 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61  0 (the "main" da
3ee0: 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72  tabase) and entr
3ef0: 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20  y 1 (the "temp" 
3f00: 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65  database).** are
3f10: 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65   never candidate
3f20: 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c  s for being coll
3f30: 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  apsed..*/.void s
3f40: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
3f50: 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69  tabaseArray(sqli
3f60: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3f70: 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
3f80: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
3f90: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3fa0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3fb0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3fc0: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
3fd0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3fe0: 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  (db, pDb->zDbSNa
3ff0: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
4000: 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  zDbSName = 0;.  
4010: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4020: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20    }.    if( j<i 
4030: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ){.      db->aDb
4040: 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  [j] = db->aDb[i]
4050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
4060: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  .  }.  db->nDb =
4070: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
4080: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
4090: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
40a0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
40b0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
40c0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
40d0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
40e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40f0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
4100: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
4110: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
4120: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
4130: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64  schema for the d
4140: 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78  atabase at index
4150: 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65   iDb.  Also rese
4160: 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63  t the.** TEMP sc
4170: 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74  hema.  The reset
4180: 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66 20   is deferred if 
4190: 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20  db->nSchemaLock 
41a0: 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20  is not zero..** 
41b0: 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73 20  Deferred resets 
41c0: 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63 61  may be run by ca
41d0: 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30  lling with iDb<0
41e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
41f0: 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28  3ResetOneSchema(
4200: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4210: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   iDb){.  int i;.
4220: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
4230: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
4240: 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
4250: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
4260: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
4270: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
4280: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
4290: 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57  , iDb, DB_ResetW
42a0: 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65  anted);.    DbSe
42b0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c  tProperty(db, 1,
42c0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
42d0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
42e0: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
42f0: 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d  hemaKnownOk;.  }
4300: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ..  if( db->nSch
4310: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4320: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4330: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4340: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
4350: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65  rty(db, i, DB_Re
4360: 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20  setWanted) ){.  
4370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68        sqlite3Sch
4380: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
4390: 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [i].pSchema);.  
43a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
43b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
43c0: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
43d0: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
43e0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
43f0: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4400: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4410: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4420: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4430: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4440: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
4450: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
4460: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4470: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
4480: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
4490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44a0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
44b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
44c0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
44d0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
44e0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
44f0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29  ( pDb->pSchema )
4500: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
4510: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4520: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
4530: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
4540: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
4550: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
4560: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4570: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
4580: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4590: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
45a0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
45b0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
45c0: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
45d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
45e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
45f0: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
4600: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
4610: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
4620: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
4630: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d  e3 *db){.  db->m
4640: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4650: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
4660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
4670: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
4680: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
4690: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
46a0: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
46b0: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
46c0: 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rray)..*/.void s
46d0: 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
46e0: 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20  mnNames(sqlite3 
46f0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4700: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
4710: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
4720: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
4730: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
4740: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
4750: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
4760: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
4770: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
4780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4790: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
47a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
47b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
47c0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
47d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
47e0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
47f0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
4800: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4810: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  db, pTable->aCol
4820: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4830: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
4840: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
4850: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4860: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
4870: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
4880: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
4890: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
48a0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
48b0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
48c0: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
48d0: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
48e0: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
48f0: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
4900: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
4910: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
4920: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
4930: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
4940: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
4950: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4960: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
4970: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
4980: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
4990: 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  db parameter is 
49a0: 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73  optional.  It is
49b0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54   needed if the T
49c0: 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  able object .** 
49d0: 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69  contains lookasi
49e0: 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62  de memory.  (Tab
49f0: 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  le objects in th
4a00: 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20  e schema do not 
4a10: 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  use.** lookaside
4a20: 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d   memory, but som
4a30: 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c  e ephemeral Tabl
4a40: 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20  e objects do.)  
4a50: 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72  Or the.** db par
4a60: 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73  ameter can be us
4a70: 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79  ed with db->pnBy
4a80: 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73  tesFreed to meas
4a90: 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a  ure the memory.*
4aa0: 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61  * used by the Ta
4ab0: 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ble object..*/.s
4ac0: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
4ad0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74  E_NOINLINE delet
4ae0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4af0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
4b00: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
4b10: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69  dex, *pNext;..#i
4b20: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4b30: 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  G.  /* Record th
4b40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
4b50: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
4b60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
4b70: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
4b80: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
4b90: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
4ba0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
4bb0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
4bc0: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
4bd0: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
4be0: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
4bf0: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e   change. */.  in
4c00: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4c10: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 70  ;.  if( db && (p
4c20: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
4c30: 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
4c40: 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61  =0 ){.    nLooka
4c50: 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  side = sqlite3Lo
4c60: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 20  okasideUsed(db, 
4c70: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
4c80: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4c90: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4ca0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4cb0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4cc0: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4cd0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4ce0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4cf0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4d00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4d10: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4d20: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4d30: 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c  hema.         ||
4d40: 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   (IsVirtual(pTab
4d50: 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  le) && pIndex->i
4d60: 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
4d70: 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20 29  DXTYPE_APPDEF) )
4d80: 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30  ;.    if( (db==0
4d90: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4da0: 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56  reed==0) && !IsV
4db0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
4dc0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
4dd0: 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e  ame = pIndex->zN
4de0: 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54  ame; .      TEST
4df0: 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f  ONLY ( Index *pO
4e00: 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61  ld = ) sqlite3Ha
4e10: 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20  shInsert(.      
4e20: 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68     &pIndex->pSch
4e30: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
4e40: 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ame, 0.      );.
4e50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
4e60: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63  ==0 || sqlite3Sc
4e70: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4e80: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
4e90: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61  hema) );.      a
4ea0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
4eb0: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
4ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4ed0: 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c  te3FreeIndex(db,
4ee0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
4ef0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
4f00: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
4f10: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
4f20: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
4f30: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
4f40: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
4f50: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
4f60: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
4f70: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4f80: 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
4f90: 5a 45 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  ZE.  if( pTable-
4fa0: 3e 70 43 6f 6c 48 61 73 68 20 29 7b 0a 20 20 20  >pColHash ){.   
4fb0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
4fc0: 72 28 70 54 61 62 6c 65 2d 3e 70 43 6f 6c 48 61  r(pTable->pColHa
4fd0: 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sh);.    sqlite3
4fe0: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 70 43  _free(pTable->pC
4ff0: 6f 6c 48 61 73 68 29 3b 0a 20 20 7d 0a 23 65 6e  olHash);.  }.#en
5000: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  dif.  sqlite3Del
5010: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
5020: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  b, pTable);.  sq
5030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5040: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
5050: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5060: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
5070: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
5080: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
5090: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
50a0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
50b0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
50c0: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
50d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50e0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
50f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
5100: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
5110: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
5120: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
5130: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
5140: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
5150: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
5160: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
5170: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5180: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
5190: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71  | nLookaside==sq
51a0: 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73  lite3LookasideUs
51b0: 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f  ed(db,0) );.}.vo
51c0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
51d0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
51e0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
51f0: 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64  ){.  /* Do not d
5200: 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20  elete the table 
5210: 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65  until the refere
5220: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
5230: 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28  s zero. */.  if(
5240: 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72   !pTable ) retur
5250: 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c  n;.  if( ((!db |
5260: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
5270: 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61  ed==0) && (--pTa
5280: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29  ble->nTabRef)>0)
5290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c   ) return;.  del
52a0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
52b0: 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ble);.}.../*.** 
52c0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
52d0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
52e0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
52f0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
5300: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
5310: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
5320: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
5330: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
5340: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
5350: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
5360: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
5370: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5380: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
5390: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
53a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
53b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
53c0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
53d0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
53e0: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
53f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
5400: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5410: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
5420: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
5430: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
5440: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
5450: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
5460: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
5470: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
5480: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
5490: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
54a0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
54b0: 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  abName, 0);.  sq
54c0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
54d0: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d  (db, p);.  db->m
54e0: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
54f0: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
5500: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5510: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
5520: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
5530: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
5540: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
5550: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
5560: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5570: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5580: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5590: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
55a0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
55b0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
55c0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
55d0: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
55e0: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
55f0: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5600: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
5610: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
5620: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
5630: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
5640: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
5650: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
5660: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5670: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5680: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5690: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
56a0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
56b0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
56c0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
56d0: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
56e0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
56f0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5700: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5710: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
5720: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5730: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5740: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5750: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5760: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5770: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5780: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5790: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
57a0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
57b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
57c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
57d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
57e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
57f0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
5800: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
5810: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
5820: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
5830: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5840: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5850: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
5860: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5870: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5880: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5890: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
58a0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
58b0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
58c0: 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e  OOT, 1, MASTER_N
58d0: 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  AME);.  sqlite3V
58e0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
58f0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
5900: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
5910: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
5920: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
5930: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
5940: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5950: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
5960: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
5970: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
5980: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
5990: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
59a0: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
59b0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
59c0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
59d0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
59e0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
59f0: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5a00: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5a10: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
5a20: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5a30: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
5a40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5a50: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
5a60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5a70: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
5a80: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
5a90: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5aa0: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
5ab0: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
5ac0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  b;.    for(i=(db
5ad0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
5ae0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
5af0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
5b00: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
5b10: 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e  e3_stricmp(pDb->
5b20: 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zDbSName, zName)
5b30: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5b40: 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77  /* "main" is alw
5b50: 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c  ays an acceptabl
5b60: 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  e alias for the 
5b70: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
5b80: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69  .      ** even i
5b90: 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 65  f it has been re
5ba0: 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49  named using SQLI
5bb0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e  TE_DBCONFIG_MAIN
5bc0: 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20  DBNAME. */.     
5bd0: 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d   if( i==0 && 0==
5be0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5bf0: 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29  "main", zName) )
5c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5c10: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5c30: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5c40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5c50: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5c60: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5c70: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5c80: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
5c90: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
5ca0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
5cb0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
5cc0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
5cd0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
5ce0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5cf0: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5d00: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5d10: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5d20: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5d30: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5d60: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5d70: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
5da0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
5db0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
5dc0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5dd0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
5de0: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5df0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5e00: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5e10: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5e20: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5e30: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5e40: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5e50: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5e60: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5e70: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
5e80: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5e90: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5ea0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5eb0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5ec0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
5ed0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5ee0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5ef0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5f00: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5f10: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5f20: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5f30: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5f40: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5f50: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5f60: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5f70: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5f80: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
5f90: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
5fa0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
5fb0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
5fc0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
5fd0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
5fe0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5ff0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
6000: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
6010: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
6020: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
6030: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
6040: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
6050: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
6060: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
6070: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6080: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6090: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
60a0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
60b0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
60c0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
60d0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
60e0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
60f0: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
6100: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
6110: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
6120: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
6130: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
6140: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
6150: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
6160: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
6170: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
6180: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
6190: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
61a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
61b0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
61c0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
61d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
61e0: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
61f0: 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69  pName2!=0 );.  i
6200: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
6210: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
6220: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
6230: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6240: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
6250: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
6260: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6270: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
6280: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
6290: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
62a0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
62b0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
62c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
62d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
62e0: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
62f0: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
6300: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6320: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6330: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
6340: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
6350: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
6360: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  T.             |
6370: 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  | (db->mDbFlags 
6380: 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29  & DBFLAG_Vacuum)
6390: 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  !=0);.    iDb = 
63a0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
63b0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
63c0: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
63d0: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
63e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
63f0: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
6400: 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e   the UTF-8 strin
6410: 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67  g zName is a leg
6420: 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65  al.** unqualifie
6430: 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77  d name for a new
6440: 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28   schema object (
6450: 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69  table, index, vi
6460: 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72  ew or.** trigger
6470: 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65  ). All names are
6480: 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68   legal except th
6490: 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77  ose that begin w
64a0: 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a  ith the string.*
64b0: 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20  * "sqlite_" (in 
64c0: 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20  upper, lower or 
64d0: 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69  mixed case). Thi
64e0: 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  s portion of the
64f0: 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73   namespace.** is
6500: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
6510: 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69  ternal use..*/.i
6520: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  nt sqlite3CheckO
6530: 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20  bjectName(Parse 
6540: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
6550: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
6560: 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( !pParse->db->
6570: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
6580: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a  rse->nested==0 .
6590: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
65a0: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
65b0: 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  & SQLITE_WriteSc
65c0: 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20  hema)==0.       
65d0: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
65e0: 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  StrNICmp(zName, 
65f0: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b  "sqlite_", 7) ){
6600: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6610: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62  rMsg(pParse, "ob
6620: 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76  ject name reserv
6630: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
6640: 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  use: %s", zName)
6650: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
6660: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
6670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6680: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
6690: 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  rn the PRIMARY K
66a0: 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61  EY index of a ta
66b0: 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ble.*/.Index *sq
66c0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
66d0: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
66e0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  ){.  Index *p;. 
66f0: 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e   for(p=pTab->pIn
6700: 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72 69  dex; p && !IsPri
6710: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b  maryKeyIndex(p);
6720: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
6730: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
6740: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
6750: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
6760: 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70  Idx that corresp
6770: 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a  onds to table.**
6780: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52   column iCol.  R
6790: 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20  eturn -1 if not 
67a0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71  found..*/.i16 sq
67b0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
67c0: 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ex(Index *pIdx, 
67d0: 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74  i16 iCol){.  int
67e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
67f0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
6800: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43  i++){.    if( iC
6810: 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ol==pIdx->aiColu
6820: 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69  mn[i] ) return i
6830: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
6840: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  1;.}../*.** Begi
6850: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
6860: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
6870: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
6880: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
6890: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
68a0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
68b0: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
68c0: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
68d0: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
68e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
68f0: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
6900: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
6910: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
6920: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
6930: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
6940: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
6950: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54  le name. The isT
6960: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
6970: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
6980: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
6990: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
69a0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
69b0: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
69c0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
69d0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
69e0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
69f0: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
6a00: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
6a10: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
6a20: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
6a30: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
6a40: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
6a50: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
6a60: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
6a70: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
6a80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
6a90: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
6aa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6ab0: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
6ac0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
6ad0: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
6ae0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
6af0: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
6b00: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
6b10: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
6b20: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
6b30: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6b40: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
6b50: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
6b60: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
6b70: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
6b80: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
6b90: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
6ba0: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
6bb0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
6bc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6bd0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
6be0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6bf0: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
6c00: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
6c10: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6c20: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
6c30: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
6c40: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
6c50: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
6c60: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6c70: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
6c80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6c90: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
6ca0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
6cb0: 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54  sView,      /* T
6cc0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6cd0: 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69   VIEW */.  int i
6ce0: 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54  sVirtual,   /* T
6cf0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6d00: 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a   VIRTUAL table *
6d10: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
6d20: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
6d30: 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65  ng if table alre
6d40: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
6d50: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
6d60: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
6d70: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
6d80: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6d90: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
6da0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6db0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
6dc0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
6dd0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
6de0: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
6df0: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
6e00: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
6e10: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
6e20: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6e30: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
6e40: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
6e50: 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  y && db->init.ne
6e60: 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20  wTnum==1 ){.    
6e70: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
6e80: 20 20 50 61 72 73 69 6e 67 20 74 68 65 20 73 71    Parsing the sq
6e90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73  lite_master or s
6ea0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
6eb0: 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20  r schema */.    
6ec0: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
6ed0: 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Db;.    zName = 
6ee0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
6ef0: 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  db, SCHEMA_TABLE
6f00: 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d  (iDb));.    pNam
6f10: 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65  e = pName1;.  }e
6f20: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
6f30: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
6f40: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6f50: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
6f60: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
6f70: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
6f80: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
6f90: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  urn;.    if( !OM
6fa0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
6fb0: 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  emp && pName2->n
6fc0: 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a  >0 && iDb!=1 ){.
6fd0: 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61        /* If crea
6fe0: 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c  ting a temp tabl
6ff0: 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20  e, the name may 
7000: 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64  not be qualified
7010: 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20  . Unless .      
7020: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
7030: 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61  name is "temp" a
7040: 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20  nyway.  */.     
7050: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7060: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
7070: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
7080: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
7090: 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed");.      retu
70a0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
70b0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
70c0: 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d  & isTemp ) iDb =
70d0: 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   1;.    zName = 
70e0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
70f0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
7100: 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  .    if( IN_RENA
7110: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
7120: 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
7130: 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c  TokenMap(pParse,
7140: 20 28 76 6f 69 64 2a 29 7a 4e 61 6d 65 2c 20 70   (void*)zName, p
7150: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
7160: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
7170: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
7180: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
7190: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
71a0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
71b0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
71c0: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
71d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
71e0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
71f0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
7200: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
7210: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
7220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
7230: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
7240: 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20  t( isTemp==0 || 
7250: 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61  isTemp==1 );.  a
7260: 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30  ssert( isView==0
7270: 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20 29 3b   || isView==1 );
7280: 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  .  {.    static 
7290: 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65 5b 5d  const u8 aCode[]
72a0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51 4c 49   = {.       SQLI
72b0: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c  TE_CREATE_TABLE,
72c0: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
72d0: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
72e0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
72f0: 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20 20 20  CREATE_VIEW,.   
7300: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7310: 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20 20 20  E_TEMP_VIEW.    
7320: 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  };.    char *zDb
7330: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7340: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
7350: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
7360: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
7370: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
7380: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
7390: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
73a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
73b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
73c0: 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61     if( !isVirtua
73d0: 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68  l && sqlite3Auth
73e0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28 69  Check(pParse, (i
73f0: 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b  nt)aCode[isTemp+
7400: 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20 20  2*isView],.     
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29    zName, 0, zDb)
7440: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7450: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7470: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
7480: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
7490: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
74a0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
74b0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
74c0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
74d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
74e0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
74f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7500: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7510: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7520: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7530: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7540: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7550: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7560: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7570: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
7580: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
7590: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
75a0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
75b0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
75c0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
75d0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
75e0: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
75f0: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 53 50 45 43  /.  if( !IN_SPEC
7600: 49 41 4c 5f 50 41 52 53 45 20 29 7b 0a 20 20 20  IAL_PARSE ){.   
7610: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
7620: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
7630: 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  me;.    if( SQLI
7640: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
7650: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
7660: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7670: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
7690: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
76a0: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
76b0: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
76c0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
76d0: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
76e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
76f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
7700: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
7710: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
7720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7730: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
7740: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43  ->init.busy || C
7750: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
7760: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
7770: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
7780: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
7790: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65   }.      goto be
77a0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
77b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
77c0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
77d0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21  db, zName, zDb)!
77e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
77f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7800: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
7810: 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e  ready an index n
7820: 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
7830: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  ;.      goto beg
7840: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7850: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61      }.  }..  pTa
7860: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ble = sqlite3DbM
7870: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7880: 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
7890: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
78a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
78b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
78c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
78d0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
78e0: 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  KPT;.    pParse-
78f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
7900: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7910: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
7920: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
7930: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
7940: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
7950: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
7960: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
7970: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61 62  ;.  pTable->nTab
7980: 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Ref = 1;.#ifdef 
7990: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
79a0: 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d 3e  OWEST.  pTable->
79b0: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c  nRowLogEst = sql
79c0: 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49 54  ite3LogEst(SQLIT
79d0: 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54  E_DEFAULT_ROWEST
79e0: 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62 6c  );.#else.  pTabl
79f0: 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  e->nRowLogEst = 
7a00: 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
7a10: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
7a20: 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e 64  1048576) );.#end
7a30: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  if.  assert( pPa
7a40: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
7a50: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
7a60: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
7a70: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
7a80: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
7a90: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
7aa0: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
7ab0: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
7ac0: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
7ad0: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
7ae0: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
7af0: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
7b00: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
7b10: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
7b20: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
7b30: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
7b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
7b50: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
7b60: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
7b70: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
7b80: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
7b90: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ")==0 ){.    ass
7ba0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
7bb0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
7bc0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
7bd0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
7be0: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
7bf0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7c00: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
7c10: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
7c20: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
7c30: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
7c40: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
7c50: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
7c60: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
7c70: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
7c80: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
7c90: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
7ca0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7cb0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
7cc0: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
7cd0: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
7ce0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
7cf0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
7d00: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
7d10: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
7d20: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
7d30: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
7d40: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7d50: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
7d60: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
7d70: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
7d80: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7d90: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
7da0: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
7db0: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
7dc0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
7dd0: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
7de0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
7df0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
7e00: 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66  addr1;.    int f
7e10: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
7e20: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
7e30: 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c  eg3;.    /* null
7e40: 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52  Row[] is an OP_R
7e50: 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f  ecord encoding o
7e60: 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  f a row containi
7e70: 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20  ng 5 NULLs */.  
7e80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7e90: 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20  har nullRow[] = 
7ea0: 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  { 6, 0, 0, 0, 0,
7eb0: 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65   0 };.    sqlite
7ec0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
7ed0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
7ee0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
7ef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7f00: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
7f10: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
7f20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7f30: 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
7f40: 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  n);.    }.#endif
7f50: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
7f60: 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20  file format and 
7f70: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20  encoding in the 
7f80: 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f  database have no
7f90: 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20  t been set, .   
7fa0: 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77   ** set them now
7fb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
7fc0: 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  1 = pParse->regR
7fd0: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
7fe0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20  >nMem;.    reg2 
7ff0: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  = pParse->regRoo
8000: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
8010: 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b  em;.    reg3 = +
8020: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8040: 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43  dOp3(v, OP_ReadC
8050: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33  ookie, iDb, reg3
8060: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
8070: 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MAT);.    sqlite
8080: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
8090: 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72  , iDb);.    addr
80a0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
80b0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
80c0: 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72  reg3); VdbeCover
80d0: 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65  age(v);.    file
80e0: 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c  Format = (db->fl
80f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67  ags & SQLITE_Leg
8100: 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f  acyFileFmt)!=0 ?
8110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8120: 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41     1 : SQLITE_MA
8130: 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20  X_FILE_FORMAT;. 
8140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8150: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
8160: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
8170: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69  _FILE_FORMAT, fi
8180: 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73  leFormat);.    s
8190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
81a0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
81b0: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58  , iDb, BTREE_TEX
81c0: 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28  T_ENCODING, ENC(
81d0: 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  db));.    sqlite
81e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
81f0: 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a   addr1);..    /*
8200: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
8210: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
8220: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
8230: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
8240: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
8250: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
8260: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
8270: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
8280: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
8290: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
82a0: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
82b0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
82c0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
82d0: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
82e0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
82f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
8300: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
8310: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  r pParse->regRow
8320: 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  id..    ** The r
8330: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
8340: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
8350: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20   is left in reg 
8360: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
8370: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
8380: 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  d and root page 
8390: 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72  number values ar
83a0: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
83b0: 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  code that.    **
83c0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
83d0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
83e0: 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69      */.#if !defi
83f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8400: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
8410: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
8420: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
8430: 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73  if( isView || is
8440: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8460: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8470: 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  , 0, reg2);.    
8480: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
8490: 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d   {.      pParse-
84a0: 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20 20  >addrCrTab =.   
84b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72  eAddOp3(v, OP_Cr
84d0: 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20  eateBtree, iDb, 
84e0: 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54 4b  reg2, BTREE_INTK
84f0: 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EY);.    }.    s
8500: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
8510: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
8520: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
8530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8540: 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  NewRowid, 0, reg
8550: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8560: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
8570: 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30  Blob, 6, reg3, 0
8580: 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54  , nullRow, P4_ST
8590: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
85a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
85b0: 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65  OP_Insert, 0, re
85c0: 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73  g3, reg1);.    s
85d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
85e0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
85f0: 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  END);.    sqlite
8600: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
8610: 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20  P_Close);.  }.. 
8620: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
8630: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
8640: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
8650: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8660: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
8670: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
8680: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
8690: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
86a0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
86b0: 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74  ../* Set propert
86c0: 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63  ies of a table c
86d0: 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74  olumn based on t
86e0: 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20  he (magical).** 
86f0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
8700: 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  mn..*/.#if SQLIT
8710: 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f  E_ENABLE_HIDDEN_
8720: 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c  COLUMNS.void sql
8730: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
8740: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62  tiesFromName(Tab
8750: 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e  le *pTab, Column
8760: 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73   *pCol){.  if( s
8770: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
8780: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f  pCol->zName, "__
8790: 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d  hidden__", 10)==
87a0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  0 ){.    pCol->c
87b0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
87c0: 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c  AG_HIDDEN;.  }el
87d0: 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20 70  se if( pTab && p
87e0: 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20  Col!=pTab->aCol 
87f0: 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c  && (pCol[-1].col
8800: 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
8810: 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70  HIDDEN) ){.    p
8820: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
8830: 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20   TF_OOOHidden;. 
8840: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
8850: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
8860: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
8870: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
8880: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
8890: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
88a0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
88b0: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
88c0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
88d0: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
88e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
88f0: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
8900: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
8910: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
8920: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
8930: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
8940: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8950: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
8960: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
8970: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
8980: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
8990: 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20  n *pName, Token 
89a0: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
89b0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
89c0: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20  char *z;.  char 
89d0: 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e  *zType;.  Column
89e0: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
89f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8a00: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
8a10: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8a20: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
8a30: 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64   if( p->nCol+1>d
8a40: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8a50: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
8a60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8a70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8a80: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
8a90: 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  on %s", p->zName
8aa0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8ab0: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
8ac0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
8ad0: 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70 65  pName->n + pType
8ae0: 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28 20  ->n + 2);.  if( 
8af0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
8b00: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
8b10: 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33 52  BJECT ) sqlite3R
8b20: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
8b30: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20  arse, (void*)z, 
8b40: 70 4e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79  pName);.  memcpy
8b50: 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  (z, pName->z, pN
8b60: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61  ame->n);.  z[pNa
8b70: 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  me->n] = 0;.  sq
8b80: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
8b90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
8ba0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
8bb0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
8bc0: 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  icmp(z, p->aCol[
8bd0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
8be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8bf0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
8c00: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
8c10: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
8c20: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8c30: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
8c40: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8c50: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
8c60: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
8c70: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
8c80: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
8c90: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
8ca0: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
8cb0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
8cc0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
8cd0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
8ce0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8cf0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
8d00: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
8d10: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
8d20: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
8d30: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
8d40: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
8d50: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
8d60: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
8d70: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69  Name = z;.  sqli
8d80: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
8d90: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70  iesFromName(p, p
8da0: 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70 54  Col);. .  if( pT
8db0: 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  ype->n==0 ){.   
8dc0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
8dd0: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
8de0: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
8df0: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
8e00: 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f  nity.    ** 'BLO
8e10: 42 27 20 77 69 74 68 20 61 20 64 65 66 61 75 6c  B' with a defaul
8e20: 74 20 73 69 7a 65 20 6f 66 20 34 20 62 79 74 65  t size of 4 byte
8e30: 73 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e  s. */.    pCol->
8e40: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8e50: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
8e60: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
8e70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e80: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e90: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
8ea0: 34 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  4>=sqlite3Global
8eb0: 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52  Config.szSorterR
8ec0: 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ef ){.      pCol
8ed0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
8ee0: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b  LFLAG_SORTERREF;
8ef0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
8f00: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65  }else{.    zType
8f10: 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74   = z + sqlite3St
8f20: 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20  rlen30(z) + 1;. 
8f30: 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c     memcpy(zType,
8f40: 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65   pType->z, pType
8f50: 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b  ->n);.    zType[
8f60: 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  pType->n] = 0;. 
8f70: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
8f80: 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43  e(zType);.    pC
8f90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8fa0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8fb0: 70 65 28 7a 54 79 70 65 2c 20 70 43 6f 6c 29 3b  pe(zType, pCol);
8fc0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  .    pCol->colFl
8fd0: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
8fe0: 41 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d  ASTYPE;.  }.  p-
8ff0: 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73  >nCol++;.  pPars
9000: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
9010: 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  e.n = 0;.}../*.*
9020: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9030: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9040: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9050: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9060: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9070: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9080: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
9090: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
90a0: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
90b0: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
90c0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
90d0: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
90e0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
90f0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9100: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
9110: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
9120: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
9130: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
9140: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
9150: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
9160: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9170: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9180: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
9190: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
91a0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
91b0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  Col[p->nCol-1];.
91c0: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
91d0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
91e0: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
91f0: 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a  TF_HasNotNull;..
9200: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 6e 69    /* Set the uni
9210: 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e  qNotNull flag on
9220: 20 61 6e 79 20 55 4e 49 51 55 45 20 6f 72 20 50   any UNIQUE or P
9230: 4b 20 69 6e 64 65 78 65 73 20 61 6c 72 65 61 64  K indexes alread
9240: 79 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f  y created.  ** o
9250: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20  n this column.  
9260: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63  */.  if( pCol->c
9270: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
9280: 47 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  G_UNIQUE ){.    
9290: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
92a0: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
92b0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
92c0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
92d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
92e0: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
92f0: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
9300: 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
9310: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
9320: 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31  mn[0]==p->nCol-1
9330: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
9340: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
9350: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
9360: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
9370: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
9380: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
9390: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
93a0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
93b0: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
93c0: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
93d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
93e0: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
93f0: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
9400: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
9410: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
9420: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
9430: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
9440: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
9450: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
9460: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
9470: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
9480: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
9490: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
94a0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
94b0: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
94c0: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
94d0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
94e0: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
94f0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
9500: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
9510: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
9520: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
9530: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
9540: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
9550: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
9560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
9580: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
9590: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
95a0: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
95b0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
95c0: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
95d0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
95e0: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
95f0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9600: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
9610: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9620: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
9630: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
9640: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
9650: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
9660: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9670: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
9680: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9690: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
96a0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
96b0: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
96c0: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
96d0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
96e0: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
96f0: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9700: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9710: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
9720: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
9730: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
9740: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
9750: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
9760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
9770: 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ar = 0;..  asser
9780: 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77  t( zIn!=0 );.  w
9790: 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  hile( zIn[0] ){.
97a0: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
97b0: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
97c0: 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66  ower[(*zIn)&0xff
97d0: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
97e0: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
97f0: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
9800: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
9810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
9820: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
9830: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9840: 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d  T;.      zChar =
9850: 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   zIn;.    }else 
9860: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
9870: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9880: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
9890: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
98a0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
98b0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
98c0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
98d0: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
98e0: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
98f0: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
9900: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9910: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9930: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
9940: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9950: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
9960: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
9970: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
9980: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
9990: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
99a0: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
99b0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  f = SQLITE_AFF_B
99c0: 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LOB;.      if( z
99d0: 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68  In[0]=='(' ) zCh
99e0: 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65  ar = zIn;.#ifnde
99f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
9a00: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
9a10: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9a20: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
9a30: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
9a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
9a50: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
9a60: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9a70: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9a80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9a90: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9aa0: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
9ab0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9ac0: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
9ad0: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
9ae0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
9af0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9b00: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
9b10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9b20: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
9b30: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
9b40: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
9b50: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
9b60: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
9b70: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
9b80: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9b90: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9ba0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
9bb0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
9bc0: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
9bd0: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
9be0: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
9bf0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
9c00: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9c10: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
9c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9c30: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c   }..  /* If pCol
9c40: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74   is not NULL, st
9c50: 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20  ore an estimate 
9c60: 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a  of the field siz
9c70: 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74  e.  The.  ** est
9c80: 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20  imate is scaled 
9c90: 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  so that the size
9ca0: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69   of an integer i
9cb0: 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  s 1.  */.  if( p
9cc0: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  Col ){.    int v
9cd0: 20 3d 20 30 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 0;   /* defau
9ce0: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
9cf0: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
9d00: 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f   if( aff<SQLITE_
9d10: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9d20: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
9d30: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9d40: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
9d50: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9d60: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
9d70: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
9d80: 20 20 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56     /* BLOB(k), V
9d90: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
9da0: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
9db0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
9dc0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
9dd0: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
9de0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9df0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9e00: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
9e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
9e20: 73 65 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  se{.        v = 
9e30: 31 36 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54  16;   /* BLOB, T
9e40: 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35  EXT, CLOB -> r=5
9e50: 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74    (approx 20 byt
9e60: 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es)*/.      }.  
9e70: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9e80: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
9e90: 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69  REFERENCES.    i
9ea0: 66 28 20 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f  f( v>=sqlite3Glo
9eb0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74  balConfig.szSort
9ec0: 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70  erRef ){.      p
9ed0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
9ee0: 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52   COLFLAG_SORTERR
9ef0: 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  EF;.    }.#endif
9f00: 0a 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31  .    v = v/4 + 1
9f10: 3b 0a 20 20 20 20 69 66 28 20 76 3e 32 35 35 20  ;.    if( v>255 
9f20: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 70  ) v = 255;.    p
9f30: 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a  Col->szEst = v;.
9f40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
9f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65  ;.}../*.** The e
9f60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
9f70: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
9f80: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
9f90: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9fa0: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  n.** of the tabl
9fb0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
9fc0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
9fd0: 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61  **.** Default va
9fe0: 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lue expressions 
9ff0: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
a000: 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65  .  Raise an exce
a010: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ption if this.**
a020: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
a030: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a040: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
a050: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
a060: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
a070: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
a080: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a090: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
a0a0: 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75   sqlite3AddDefau
a0b0: 6c 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65  ltValue(.  Parse
a0c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a0d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a0e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a0f0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
a100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
a110: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  ed expression of
a120: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
a130: 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ue */.  const ch
a140: 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20  ar *zStart,     
a150: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
a160: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74   default value t
a170: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
a180: 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20  har *zEnd       
a190: 20 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61    /* First chara
a1a0: 63 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66  cter past end of
a1b0: 20 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65   defaut value te
a1c0: 78 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  xt */.){.  Table
a1d0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
a1e0: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
a1f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a200: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
a210: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
a220: 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  p!=0 ){.    pCol
a230: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
a240: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
a250: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
a260: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a270: 6f 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e  on(pExpr, db->in
a280: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
a290: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a2a0: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
a2b0: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
a2c0: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
a2d0: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
a2e0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
a2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a300: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
a310: 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e  pExpr is used in
a320: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69  stead of the ori
a330: 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20  ginal, as pExpr 
a340: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
a350: 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f  * tokens that po
a360: 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20  int to volatile 
a370: 6d 65 6d 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f  memory..      */
a380: 0a 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20  .      Expr x;. 
a390: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a3a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
a3b0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d  >pDflt);.      m
a3c0: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
a3d0: 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78  eof(x));.      x
a3e0: 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20  .op = TK_SPAN;. 
a3f0: 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20       x.u.zToken 
a400: 3d 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44  = sqlite3DbSpanD
a410: 75 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a  up(db, zStart, z
a420: 45 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c  End);.      x.pL
a430: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
a440: 20 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f     x.flags = EP_
a450: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Skip;.      pCol
a460: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
a470: 33 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c  3ExprDup(db, &x,
a480: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
a490: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a4a0: 62 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54  bFree(db, x.u.zT
a4b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oken);.    }.  }
a4c0: 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
a4d0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73  _OBJECT ){.    s
a4e0: 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72  qlite3RenameExpr
a4f0: 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45  Unmap(pParse, pE
a500: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  xpr);.  }.  sqli
a510: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a520: 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
a530: 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d  ** Backwards Com
a540: 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a  patibility Hack:
a550: 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63  .** .** Historic
a560: 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  al versions of S
a570: 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73  QLite accepted s
a580: 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e  trings as column
a590: 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64   names in.** ind
a5a0: 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59  exes and PRIMARY
a5b0: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
a5c0: 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63   and in UNIQUE c
a5d0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61  onstraints.  Exa
a5e0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
a5f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a  CREATE TABLE xyz
a600: 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41  (a,b,c,d,e,PRIMA
a610: 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51  RY KEY('a'),UNIQ
a620: 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41  UE('b','c' COLLA
a630: 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20  TE trim).**     
a640: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63  CREATE INDEX abc
a650: 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20   ON xyz('c','d' 
a660: 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45  DESC,'e' COLLATE
a670: 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a   nocase DESC);.*
a680: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f  *.** This is goo
a690: 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73  fy.  But to pres
a6a0: 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63  erve backwards c
a6b0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20  ompatibility we 
a6c0: 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61  continue to.** a
a6d0: 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20  ccept it.  This 
a6e0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
a6f0: 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65   necessary conve
a700: 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65  rsion.  It conve
a710: 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  rts.** the expre
a720: 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69  ssion given in i
a730: 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d  ts argument from
a740: 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74   a TK_STRING int
a750: 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20  o a TK_ID.** if 
a760: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a770: 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49  s just a TK_STRI
a780: 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f  NG with an optio
a790: 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75  nal COLLATE clau
a7a0: 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70  se..** If the ep
a7b0: 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74  xression is anyt
a7c0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
a7d0: 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65  TK_STRING, the e
a7e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
a7f0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
a800: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
a810: 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72  3StringToId(Expr
a820: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f   *p){.  if( p->o
a830: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a840: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49      p->op = TK_I
a850: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
a860: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
a870: 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   && p->pLeft->op
a880: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a890: 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20     p->pLeft->op 
a8a0: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a  = TK_ID;.  }.}..
a8b0: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
a8c0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a8d0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
a8e0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a8f0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
a900: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
a910: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
a920: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
a930: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
a940: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
a950: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
a960: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
a970: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
a980: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
a990: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
a9a0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a9b0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
a9c0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
a9d0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
a9e0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
a9f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
aa00: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
aa10: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
aa20: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
aa30: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
aa40: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
aa50: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
aa60: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
aa70: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
aa80: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
aa90: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
aaa0: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
aab0: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
aac0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
aad0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
aae0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
aaf0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ab00: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
ab10: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
ab20: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
ab30: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
ab40: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
ab50: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
ab60: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
ab70: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
ab80: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
ab90: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
aba0: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
abb0: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
abc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
abd0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
abe0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
abf0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
ac00: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
ac10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
ac20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
ac30: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
ac40: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
ac50: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
ac60: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
ac70: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
ac80: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
ac90: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
aca0: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
acb0: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
acc0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
acd0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
ace0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
acf0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
ad00: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
ad10: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
ad20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
ad30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
ad40: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
ad50: 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
ad60: 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54   -1, i;.  int nT
ad70: 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  erm;.  if( pTab=
ad80: 3d 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  =0 ) goto primar
ad90: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
ada0: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
adb0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
adc0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
add0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ade0: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
adf0: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
ae00: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
ae10: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
ae20: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
ae30: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
ae40: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
ae50: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
ae60: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
ae70: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
ae80: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
ae90: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c  ol - 1;.    pCol
aea0: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
aeb0: 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Col];.    pCol->
aec0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
aed0: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
aee0: 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65   nTerm = 1;.  }e
aef0: 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  lse{.    nTerm =
af00: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
af10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54     for(i=0; i<nT
af20: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
af30: 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20   Expr *pCExpr = 
af40: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
af50: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
af60: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
af70: 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21   assert( pCExpr!
af80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
af90: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43  te3StringToId(pC
afa0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
afb0: 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   pCExpr->op==TK_
afc0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ID ){.        co
afd0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65  nst char *zCName
afe0: 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f   = pCExpr->u.zTo
aff0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
b000: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
b010: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
b020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b030: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b040: 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  zCName, pTab->aC
b050: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
b060: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b070: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
b080: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
b090: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
b0a0: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
b0b0: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20  G_PRIMKEY;.     
b0c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b0d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b0e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b0f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72  }.  }.  if( nTer
b100: 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a  m==1.   && pCol.
b110: 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
b120: 49 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75  ICmp(sqlite3Colu
b130: 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c  mnType(pCol,""),
b140: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
b150: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d    && sortOrder!=
b160: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20  SQLITE_SO_DESC. 
b170: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52   ){.    if( IN_R
b180: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20  ENAME_OBJECT && 
b190: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73  pList ){.      s
b1a0: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
b1b0: 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26  nRemap(pParse, &
b1c0: 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20 70 4c 69  pTab->iPKey, pLi
b1d0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
b1e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 2d  .    }.    pTab-
b1f0: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
b200: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
b210: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
b220: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
b230: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
b240: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
b250: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
b260: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
b270: 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  rement;.    if( 
b280: 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e  pList ) pParse->
b290: 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  iPkSortOrder = p
b2a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
b2b0: 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rder;.  }else if
b2c0: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
b2d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b2e0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
b2f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b300: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
b310: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
b320: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
b330: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
b340: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
b350: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
b360: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
b370: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
b380: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
b390: 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20  onError, 0,.    
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72         0, sortOr
b3c0: 64 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49  der, 0, SQLITE_I
b3d0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
b3e0: 59 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  Y);.    pList = 
b3f0: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
b400: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
b410: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
b420: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
b430: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
b440: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
b450: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
b460: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
b470: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
b480: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
b490: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
b4a0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
b4b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b4c0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
b4d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b4e0: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
b4f0: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
b500: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
b510: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b520: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
b530: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
b540: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c  pNewTable;.  sql
b550: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b560: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61  e->db;.  if( pTa
b570: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
b580: 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c  _VTAB.   && !sql
b590: 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
b5a0: 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e  nly(db->aDb[db->
b5b0: 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20  init.iDb].pBt). 
b5c0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43   ){.    pTab->pC
b5d0: 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  heck = sqlite3Ex
b5e0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b5f0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b600: 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  k, pCheckExpr);.
b610: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
b620: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e  constraintName.n
b630: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b640: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
b650: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
b660: 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e  Check, &pParse->
b670: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20  constraintName, 
b680: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
b690: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
b6a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b6b0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
b6c0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a  CheckExpr);.  }.
b6d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b6e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
b6f0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
b700: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
b710: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
b720: 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67  to the CollSeq g
b730: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
b740: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
b750: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
b760: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  e, Token *pToken
b770: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
b780: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
b790: 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
b7a0: 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20      /* Dequoted 
b7b0: 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f  name of collatio
b7c0: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
b7d0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
b7e0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
b7f0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
b800: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
b810: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d  ->nCol-1;.  db =
b820: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a   pParse->db;.  z
b830: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
b840: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b850: 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21  pToken);.  if( !
b860: 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
b870: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
b880: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
b890: 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
b8a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
b8b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b8c0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  (db, p->aCol[i].
b8d0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  zColl);.    p->a
b8e0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a  Col[i].zColl = z
b8f0: 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  Coll;.  .    /* 
b900: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  If the column is
b910: 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e   declared as "<n
b920: 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59  ame> PRIMARY KEY
b930: 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22   COLLATE <type>"
b940: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
b950: 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20   index may have 
b960: 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20  been created on 
b970: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f  this column befo
b980: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  re the.    ** co
b990: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73  llation type was
b9a0: 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20   added. Correct 
b9b0: 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68  this if it is th
b9c0: 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  e case..    */. 
b9d0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70     for(pIdx=p->p
b9e0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
b9f0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
ba00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
ba10: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29  dx->nKeyCol==1 )
ba20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
ba30: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
ba40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
ba50: 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d  ->azColl[0] = p-
ba60: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[i].zColl;.
ba70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ba80: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
ba90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
baa0: 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ll);.  }.}../*.*
bab0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bac0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
bad0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
bae0: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
baf0: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
bb00: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
bb10: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
bb20: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
bb30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
bb40: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
bb50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
bb60: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
bb70: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
bb80: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
bb90: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
bba0: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
bbb0: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
bbc0: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
bbd0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
bbe0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
bbf0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
bc00: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
bc10: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
bc20: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
bc30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
bc40: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
bc50: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
bc60: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
bc70: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
bc80: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
bc90: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
bca0: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
bcb0: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
bcc0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
bcd0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
bce0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
bcf0: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
bd00: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
bd10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
bd20: 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20  ne is a wrapper 
bd30: 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69  around sqlite3Fi
bd40: 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68  ndCollSeq().  Th
bd50: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e  is routine.** in
bd60: 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  vokes the collat
bd70: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74  ion factory if t
bd80: 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69  he named collati
bd90: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  on cannot be fou
bda0: 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  nd.** and genera
bdb0: 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  tes an error mes
bdc0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  sage..**.** See 
bdd0: 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e  also: sqlite3Fin
bde0: 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69  dCollSeq(), sqli
bdf0: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a  te3GetCollSeq().
be00: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
be10: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
be20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
be30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
be40: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
be50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
be60: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
be70: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
be80: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
be90: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
bea0: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
beb0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
bec0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
bed0: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
bee0: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
bef0: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
bf00: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
bf10: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
bf20: 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  GetCollSeq(pPars
bf30: 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a  e, enc, pColl, z
bf40: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Name);.  }..  re
bf50: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a  turn pColl;.}...
bf60: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
bf70: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
bf80: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65  crement the sche
bf90: 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a  ma cookie..**.**
bfa0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
bfb0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
bfc0: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
bfd0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
bfe0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
bff0: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
c000: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
c010: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
c020: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
c030: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
c040: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
c050: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
c060: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
c070: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
c080: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
c090: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
c0a0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
c0b0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
c0c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
c0d0: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
c0e0: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
c0f0: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
c100: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
c110: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
c120: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
c130: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
c140: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
c150: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
c160: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
c170: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
c180: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
c190: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
c1a0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
c1b0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
c1c0: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
c1d0: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
c1e0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
c1f0: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
c200: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
c210: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
c220: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a   safe enough..**
c230: 0a 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  .** IMPLEMENTATI
c240: 4f 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35  ON-OF: R-34230-5
c250: 36 30 34 39 20 53 51 4c 69 74 65 20 61 75 74 6f  6049 SQLite auto
c260: 6d 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d  matically increm
c270: 65 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68 65  ents.** the sche
c280: 6d 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e 65  ma-version whene
c290: 76 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 63  ver the schema c
c2a0: 68 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  hanges..*/.void 
c2b0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
c2c0: 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  kie(Parse *pPars
c2d0: 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73  e, int iDb){.  s
c2e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c2f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
c300: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
c310: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  be;.  assert( sq
c320: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
c330: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
c340: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
c350: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
c360: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
c370: 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
c380: 4f 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ON, .           
c390: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 31 2b          (int)(1+
c3a0: 28 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61 44  (unsigned)db->aD
c3b0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
c3c0: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b  schema_cookie));
c3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
c3e0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
c3f0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
c400: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
c410: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
c420: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
c430: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
c440: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
c450: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
c460: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
c470: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
c480: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
c490: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
c4a0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
c4b0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
c4c0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
c4d0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
c4e0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
c4f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
c500: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
c510: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
c520: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
c530: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
c540: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
c550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
c560: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
c570: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c580: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
c590: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
c5a0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
c5b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
c5c0: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
c5d0: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
c5e0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
c5f0: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
c600: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
c610: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
c620: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
c630: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
c640: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
c650: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
c660: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
c670: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
c680: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
c690: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
c6a0: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
c6b0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
c6c0: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
c6d0: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
c6e0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
c6f0: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
c700: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
c710: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
c720: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
c730: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
c740: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
c750: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
c760: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
c770: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
c780: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
c790: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
c7a0: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
c7b0: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
c7c0: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
c7d0: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
c7e0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
c7f0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
c800: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
c810: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
c820: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
c830: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
c840: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
c850: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
c860: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
c870: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
c880: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
c890: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c8a0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
c8b0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
c8c0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
c8d0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
c8e0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
c8f0: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
c900: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
c910: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
c920: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
c930: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
c940: 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  _ID.            
c950: 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a  || zIdent[j]!=0.
c960: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a              || j
c970: 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  ==0;..  if( need
c980: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c990: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
c9a0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c9b0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
c9c0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
c9d0: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
c9e0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c9f0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
ca00: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
ca10: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
ca20: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
ca30: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ca40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
ca50: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
ca60: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
ca70: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
ca80: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
ca90: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
caa0: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
cab0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
cac0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
cad0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
cae0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
caf0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
cb00: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
cb10: 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Stmt(sqlite3 *db
cb20: 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  , Table *p){.  i
cb30: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
cb40: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
cb50: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
cb60: 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e   *zEnd;.  Column
cb70: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
cb80: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
cb90: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
cba0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
cbb0: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
cbc0: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
cbd0: 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a  zName) + 5;.  }.
cbe0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
cbf0: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
cc00: 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20  if( n<50 ){ .   
cc10: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
cc20: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
cc30: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
cc40: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
cc50: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
cc60: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
cc70: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
cc80: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
cc90: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
cca0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  mt = sqlite3DbMa
ccb0: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20  llocRaw(0, n);. 
ccc0: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
ccd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
cce0: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65  ault(db);.    re
ccf0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
cd00: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
cd10: 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45  , zStmt, "CREATE
cd20: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
cd30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
cd40: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
cd50: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
cd60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
cd70: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
cd80: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
cd90: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
cda0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
cdb0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
cdc0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
cdd0: 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Type[] = {.     
cde0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
cdf0: 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a  _BLOB    */ "",.
ce00: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
ce10: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f  E_AFF_TEXT    */
ce20: 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20   " TEXT",.      
ce30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
ce40: 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d  NUMERIC */ " NUM
ce50: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
ce60: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
ce70: 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20   */ " INT",.    
ce80: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
ce90: 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52  F_REAL    */ " R
cea0: 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  EAL".    };.    
ceb0: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e  int len;.    con
cec0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
ced0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
cee0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
cef0: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
cf00: 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   k += sqlite3Str
cf10: 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29  len30(&zStmt[k])
cf20: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
cf30: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
cf40: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
cf50: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73  ->zName);.    as
cf60: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
cf70: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
cf80: 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20  BLOB >= 0 );.   
cf90: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
cfa0: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
cfb0: 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53  FF_BLOB < ArrayS
cfc0: 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20  ize(azType) );. 
cfd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
cfe0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
cff0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a  ITE_AFF_BLOB );.
d000: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
d010: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
d020: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
d030: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d040: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d050: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
d060: 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  C );.    testcas
d070: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
d080: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  y==SQLITE_AFF_IN
d090: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73  TEGER );.    tes
d0a0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d0b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d0c0: 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20  F_REAL );.    . 
d0d0: 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70     zType = azTyp
d0e0: 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  e[pCol->affinity
d0f0: 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   - SQLITE_AFF_BL
d100: 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  OB];.    len = s
d110: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
d120: 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Type);.    asser
d130: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
d140: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  y==SQLITE_AFF_BL
d150: 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB .            
d160: 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  || pCol->affinit
d170: 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69  y==sqlite3Affini
d180: 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29  tyType(zType, 0)
d190: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   );.    memcpy(&
d1a0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c  zStmt[k], zType,
d1b0: 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20   len);.    k += 
d1c0: 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  len;.    assert(
d1d0: 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73   k<=n );.  }.  s
d1e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d1f0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
d200: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
d210: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
d220: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20  /*.** Resize an 
d230: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
d240: 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74  hold N columns t
d250: 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51  otal.  Return SQ
d260: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
d270: 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45  ccess and SQLITE
d280: 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d  _NOMEM on an OOM
d290: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
d2a0: 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65  c int resizeInde
d2b0: 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  xObject(sqlite3 
d2c0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
d2d0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72  , int N){.  char
d2e0: 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20   *zExtra;.  int 
d2f0: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64  nByte;.  if( pId
d300: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20  x->nColumn>=N ) 
d310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d320: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
d330: 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29  ->isResized==0 )
d340: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a  ;.  nByte = (siz
d350: 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a  eof(char*) + siz
d360: 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b  eof(i16) + 1)*N;
d370: 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69  .  zExtra = sqli
d380: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
d390: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
d3a0: 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65  ( zExtra==0 ) re
d3b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d3c0: 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
d3d0: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d3e0: 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68  zColl, sizeof(ch
d3f0: 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  ar*)*pIdx->nColu
d400: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  mn);.  pIdx->azC
d410: 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  oll = (const cha
d420: 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45  r**)zExtra;.  zE
d430: 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63  xtra += sizeof(c
d440: 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70  har*)*N;.  memcp
d450: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
d460: 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66  aiColumn, sizeof
d470: 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  (i16)*pIdx->nCol
d480: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  umn);.  pIdx->ai
d490: 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a  Column = (i16*)z
d4a0: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
d4b0: 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e  += sizeof(i16)*N
d4c0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
d4d0: 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  a, pIdx->aSortOr
d4e0: 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  der, pIdx->nColu
d4f0: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f  mn);.  pIdx->aSo
d500: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a  rtOrder = (u8*)z
d510: 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e  Extra;.  pIdx->n
d520: 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49  Column = N;.  pI
d530: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20  dx->isResized = 
d540: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
d550: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d560: 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74  Estimate the tot
d570: 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72  al row width for
d580: 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61   a table..*/.sta
d590: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
d5a0: 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c  eTableWidth(Tabl
d5b0: 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69  e *pTab){.  unsi
d5c0: 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b  gned wTable = 0;
d5d0: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
d5e0: 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20  *pTabCol;.  int 
d5f0: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d  i;.  for(i=pTab-
d600: 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70  >nCol, pTabCol=p
d610: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20  Tab->aCol; i>0; 
d620: 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b  i--, pTabCol++){
d630: 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70  .    wTable += p
d640: 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  TabCol->szEst;. 
d650: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69   }.  if( pTab->i
d660: 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b  PKey<0 ) wTable+
d670: 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62  +;.  pTab->szTab
d680: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
d690: 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d  Est(wTable*4);.}
d6a0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d6b0: 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a   the average siz
d6c0: 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61  e of a row for a
d6d0: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  n index..*/.stat
d6e0: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
d6f0: 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78  IndexWidth(Index
d700: 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
d710: 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a  ned wIndex = 0;.
d720: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
d730: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
d740: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
d750: 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ol;.  for(i=0; i
d760: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
d770: 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20  i++){.    i16 x 
d780: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
d790: 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
d7a0: 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   x<pIdx->pTable-
d7b0: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e  >nCol );.    wIn
d7c0: 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a  dex += x<0 ? 1 :
d7d0: 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f   aCol[pIdx->aiCo
d7e0: 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a  lumn[i]].szEst;.
d7f0: 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64    }.  pIdx->szId
d800: 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  xRow = sqlite3Lo
d810: 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a  gEst(wIndex*4);.
d820: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  }../* Return tru
d830: 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20  e if value x is 
d840: 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  found any of the
d850: 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72   first nCol entr
d860: 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a  ies of aiCol[].*
d870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
d880: 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36  Column(const i16
d890: 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f   *aiCol, int nCo
d8a0: 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69  l, int x){.  whi
d8b0: 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29  le( nCol-- > 0 )
d8c0: 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b   if( x==*(aiCol+
d8d0: 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  +) ) return 1;. 
d8e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d8f0: 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63   Recompute the c
d900: 6f 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c 64  olNotIdxed field
d910: 20 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a   of the Index..*
d920: 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64  *.** colNotIdxed
d930: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
d940: 61 74 20 68 61 73 20 61 20 30 20 62 69 74 20 72  at has a 0 bit r
d950: 65 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63 68  epresenting each
d960: 20 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75   indexed.** colu
d970: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 77 69 74  mns that are wit
d980: 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 36 33  hin the first 63
d990: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d9a0: 74 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68  table.  The.** h
d9b0: 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66  igh-order bit of
d9c0: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
d9d0: 61 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20 75  always 1.  All u
d9e0: 6e 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  nindexed columns
d9f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
da00: 20 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a   have a 1..**.**
da10: 20 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64   The colNotIdxed
da20: 20 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64 20   mask is AND-ed 
da30: 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
da40: 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73  .a[].colUsed mas
da50: 6b 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  k.** to determin
da60: 65 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  e if the index i
da70: 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  s covering index
da80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
da90: 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
daa0: 73 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64 65  sNotIndexed(Inde
dab0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d  x *pIdx){.  Bitm
dac0: 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74  ask m = 0;.  int
dad0: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78   j;.  for(j=pIdx
dae0: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d  ->nColumn-1; j>=
daf0: 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; j--){.    int
db00: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
db10: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  umn[j];.    if( 
db20: 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  x>=0 ){.      te
db30: 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31  stcase( x==BMS-1
db40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
db50: 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a  se( x==BMS-2 );.
db60: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
db70: 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54  1 ) m |= MASKBIT
db80: 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (x);.    }.  }. 
db90: 20 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78   pIdx->colNotIdx
dba0: 65 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72  ed = ~m;.  asser
dbb0: 74 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74  t( (pIdx->colNot
dbc0: 49 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b  Idxed>>63)==1 );
dbd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
dbe0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
dbf0: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
dc00: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
dc10: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
dc20: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
dc30: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
dc40: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
dc50: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
dc60: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
dc70: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
dc80: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
dc90: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
dca0: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
dcb0: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
dcc0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
dcd0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
dce0: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
dcf0: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
dd00: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
dd10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
dd20: 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   Set all columns
dd30: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
dd40: 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  KEY schema objec
dd50: 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c  t to be NOT NULL
dd60: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f  ..**     (2)  Co
dd70: 6e 76 65 72 74 20 50 33 20 70 61 72 61 6d 65 74  nvert P3 paramet
dd80: 65 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65  er of the OP_Cre
dd90: 61 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54  ateBtree from BT
dda0: 52 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20  REE_INTKEY .**  
ddb0: 20 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52          into BTR
ddc0: 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20  EE_BLOBKEY..**  
ddd0: 20 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74     (3)  Bypass t
dde0: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
ddf0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
de00: 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20   table entry.** 
de10: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65           for the
de20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20   PRIMARY KEY as 
de30: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
de40: 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20  index is now.** 
de50: 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
de60: 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  ied by the sqlit
de70: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
de80: 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
de90: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20  e itself..**    
dea0: 20 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e   (4)  Set the In
deb0: 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20  dex.tnum of the 
dec0: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
ded0: 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  x object in the.
dee0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65  **          sche
def0: 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61  ma to the rootpa
df00: 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ge from the main
df10: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28   table..**     (
df20: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
df30: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
df40: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
df50: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
df60: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
df70: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
df80: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
df90: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
dfa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
dfb0: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
dfc0: 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c  KeyInfo.nAllFiel
dfd0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73  d and are not us
dfe0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ed for.**       
dff0: 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f     sorting or lo
e000: 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65  okup or uniquene
e010: 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20  ss checks..**   
e020: 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74    (6)  Replace t
e030: 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e  he rowid tail on
e040: 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c   all automatical
e050: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49  ly generated UNI
e060: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
e070: 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65  indices with the
e080: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
e090: 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  umns..**.** For 
e0a0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20  virtual tables, 
e0b0: 6f 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66  only (1) is perf
e0c0: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
e0d0: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
e0e0: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
e0f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e100: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
e110: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
e120: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
e130: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   nPk;.  int i, j
e140: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
e150: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
e160: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
e170: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d  ->pVdbe;..  /* M
e180: 61 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52  ark every PRIMAR
e190: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20  Y KEY column as 
e1a0: 4e 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74  NOT NULL (except
e1b0: 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
e1c0: 62 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28  bles).  */.  if(
e1d0: 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73   !db->init.impos
e1e0: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
e1f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
e200: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
e210: 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43     if( (pTab->aC
e220: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
e230: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
e240: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
e250: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f  pTab->aCol[i].no
e260: 74 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74  tNull = OE_Abort
e270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e280: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
e290: 74 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64  t the P3 operand
e2a0: 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74   of the OP_Creat
e2b0: 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72  eBtree opcode fr
e2c0: 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a  om BTREE_INTKEY.
e2d0: 20 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f    ** into BTREE_
e2e0: 42 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  BLOBKEY..  */.  
e2f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72  if( pParse->addr
e300: 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  CrTab ){.    ass
e310: 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71  ert( v );.    sq
e320: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e330: 33 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  3(v, pParse->add
e340: 72 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c  rCrTab, BTREE_BL
e350: 4f 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  OBKEY);.  }..  /
e360: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49  * Locate the PRI
e370: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
e380: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62   Or, if this tab
e390: 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  le was originall
e3a0: 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45  y.  ** an INTEGE
e3b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61  R PRIMARY KEY ta
e3c0: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ble, create a ne
e3d0: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  w PRIMARY KEY in
e3e0: 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  dex. .  */.  if(
e3f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
e400: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
e410: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65  *pList;.    Toke
e420: 6e 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20  n ipkToken;.    
e430: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
e440: 28 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62  (&ipkToken, pTab
e450: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
e460: 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
e470: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
e480: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
e490: 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20  arse, 0, .      
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e4b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
e4c0: 20 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65   TK_ID, &ipkToke
e4d0: 6e 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  n, 0));.    if( 
e4e0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
e4f0: 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  n;.    pList->a[
e500: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  0].sortOrder = p
e510: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
e520: 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  der;.    assert(
e530: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e540: 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  le==pTab );.    
e550: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
e560: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
e570: 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d   0, pList, pTab-
e580: 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20  >keyConf, 0, 0, 
e590: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e5b0: 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
e5c0: 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28  ARYKEY);.    if(
e5d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e5e0: 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
e5f0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  r ) return;.    
e600: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
e610: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
e620: 62 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  b);.    pTab->iP
e630: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
e640: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
e650: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
e660: 64 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20  dex(pTab);..    
e670: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  /*.    ** Remove
e680: 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63   all redundant c
e690: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
e6a0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
e6b0: 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67  r example, chang
e6c0: 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52  e.    ** "PRIMAR
e6d0: 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c  Y KEY(a,b,a,b,c,
e6e0: 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73  b,c,d)" into jus
e6f0: 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  t "PRIMARY KEY(a
e700: 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72  ,b,c,d)".  Later
e710: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73  .    ** code ass
e720: 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  umes the PRIMARY
e730: 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   KEY contains no
e740: 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e   repeated column
e750: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
e760: 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e  r(i=j=1; i<pPk->
e770: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
e780: 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
e790: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
e7a0: 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  , j, pPk->aiColu
e7b0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
e7c0: 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d    pPk->nColumn--
e7d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e7e0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e7f0: 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d  lumn[j++] = pPk-
e800: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e810: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e820: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a  pPk->nKeyCol = j
e830: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e840: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d  pPk!=0 );.  pPk-
e850: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
e860: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e870: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e880: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
e890: 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70  l = 1;.  nPk = p
e8a0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20  Pk->nKeyCol;..  
e8b0: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
e8c0: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
e8d0: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
e8e0: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
e8f0: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
e900: 20 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20   entry. This is 
e910: 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66  only required if
e920: 20 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72   currently gener
e930: 61 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20  ating VDBE.  ** 
e940: 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54  code for a CREAT
e950: 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65  E TABLE (not whe
e960: 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73  n parsing one as
e970: 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67   part of reading
e980: 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
e990: 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20   schema).  */.  
e9a0: 69 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e  if( v && pPk->tn
e9b0: 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  um>0 ){.    asse
e9c0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  rt( db->init.bus
e9d0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  y==0 );.    sqli
e9e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
e9f0: 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d  ode(v, pPk->tnum
ea00: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a  , OP_Goto);.  }.
ea10: 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70  .  /* The root p
ea20: 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41  age of the PRIMA
ea30: 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61  RY KEY is the ta
ea40: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  ble root page */
ea50: 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70  .  pPk->tnum = p
ea60: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a  Tab->tnum;..  /*
ea70: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
ea80: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
ea90: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51  tion of all UNIQ
eaa0: 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f  UE indices by co
eab0: 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68  nverting.  ** th
eac0: 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f  e final rowid co
ead0: 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72  lumn into one or
eae0: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
eaf0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
eb00: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
eb10: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
eb20: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
eb30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
eb40: 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72   n;.    if( IsPr
eb50: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
eb60: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
eb70: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69      for(i=n=0; i
eb80: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
eb90: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
eba0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
ebb0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
ebc0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
ebd0: 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) n++;.    }. 
ebe0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
ebf0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
ec00: 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ex is a superset
ec10: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
ec20: 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64  key */.      pId
ec30: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64  x->nColumn = pId
ec40: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
ec50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
ec60: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
ec70: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
ec80: 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
ec90: 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
eca0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
ecb0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
ecc0: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
ecd0: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
ece0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
ecf0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
ed00: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
ed10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  ) ){.        pId
ed20: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  x->aiColumn[j] =
ed30: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
ed40: 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ];.        pIdx-
ed50: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
ed60: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
ed70: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
ed80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
ed90: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
eda0: 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n>=pIdx->nKeyCol
edb0: 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +n );.    assert
edc0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
edd0: 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =j );.  }..  /* 
ede0: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
edf0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
ee00: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
ee10: 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54   */.  if( nPk<pT
ee20: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
ee30: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
ee40: 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70  bject(db, pPk, p
ee50: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74  Tab->nCol) ) ret
ee60: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
ee70: 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d  , j=nPk; i<pTab-
ee80: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
ee90: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
eea0: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
eeb0: 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20   j, i) ){.      
eec0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d    assert( j<pPk-
eed0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
eee0: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
eef0: 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[j] = i;.      
ef00: 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d    pPk->azColl[j]
ef10: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
ef20: 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  ARY;.        j++
ef30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ef40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
ef50: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20  >nColumn==j );. 
ef60: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
ef70: 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65  >nCol==j );.  }e
ef80: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43  lse{.    pPk->nC
ef90: 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43  olumn = pTab->nC
efa0: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70  ol;.  }.  recomp
efb0: 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64  uteColumnsNotInd
efc0: 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 2f 2a  exed(pPk);.}../*
efd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
efe0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
eff0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
f000: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
f010: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
f020: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
f030: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
f040: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
f050: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
f060: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
f070: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
f080: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
f090: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
f0a0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
f0b0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
f0c0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
f0d0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
f0e0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
f0f0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
f100: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
f110: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
f120: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
f130: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
f140: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
f150: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
f160: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
f170: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
f180: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
f190: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
f1a0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
f1b0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
f1c0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
f1d0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
f1e0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
f1f0: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
f200: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
f210: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
f220: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
f230: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
f240: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
f250: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
f260: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
f270: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
f280: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
f290: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
f2a0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
f2b0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
f2c0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
f2d0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
f2e0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
f2f0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
f300: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
f310: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
f320: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
f330: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
f340: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
f350: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
f360: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
f370: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f380: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
f390: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
f3a0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
f3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f3c0: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
f3d0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
f3e0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
f3f0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
f400: 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65     /* The ')' be
f410: 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  fore options in 
f420: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
f430: 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73   */.  u8 tabOpts
f440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f450: 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74   Extra table opt
f460: 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e  ions. Usually 0.
f470: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
f480: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
f490: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
f4a0: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
f4b0: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
f4c0: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
f4d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
f4e0: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
f4f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
f500: 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
f510: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f520: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
f550: 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65   which the table
f560: 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65   lives */.  Inde
f570: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
f580: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c        /* An impl
f590: 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  ied index of the
f5a0: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
f5b0: 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c   pEnd==0 && pSel
f5c0: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
f5d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
f5e0: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
f5f0: 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70  ailed );.  p = p
f600: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
f610: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
f620: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
f630: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
f640: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
f650: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
f660: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
f670: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
f680: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
f690: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
f6a0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
f6b0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
f6c0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
f6d0: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
f6e0: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
f6f0: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
f700: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
f710: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
f720: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
f730: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
f740: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
f750: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
f760: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
f770: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
f780: 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
f790: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
f7a0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
f7b0: 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
f7c0: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
f7d0: 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
f7e0: 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
f7f0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
f800: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f810: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
f820: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f830: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22 29  rMsg(pParse, "")
f840: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
f850: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
f860: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
f870: 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
f880: 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
f890: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
f8a0: 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  donly;.  }..  /*
f8b0: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
f8c0: 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
f8d0: 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
f8e0: 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
f8f0: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
f900: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
f910: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
f920: 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
f930: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f940: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f950: 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
f960: 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
f970: 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
f980: 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
f990: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f9a0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
f9b0: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
f9c0: 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
f9d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f9e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
f9f0: 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
fa00: 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
fa10: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
fa20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
fa30: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57  tabFlags |= TF_W
fa40: 69 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46  ithoutRowid | TF
fa50: 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b  _NoVisibleRowid;
fa60: 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f  .      convertTo
fa70: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
fa80: 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  e(pParse, p);.  
fa90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d    }.  }..  iDb =
faa0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
fab0: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
fac0: 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
fad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
fae0: 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  K.  /* Resolve n
faf0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43  ames in all CHEC
fb00: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70  K constraint exp
fb10: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ressions..  */. 
fb20: 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29   if( p->pCheck )
fb30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
fb40: 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
fb50: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f  e(pParse, p, NC_
fb60: 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70  IsCheck, 0, p->p
fb70: 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64  Check);.  }.#end
fb80: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
fb90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
fba0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) */..  /* Estim
fbb0: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
fbc0: 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65  row size for the
fbd0: 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61   table and for a
fbe0: 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63  ll implied indic
fbf0: 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65  es */.  estimate
fc00: 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20  TableWidth(p);. 
fc10: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
fc20: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
fc30: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
fc40: 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57    estimateIndexW
fc50: 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a  idth(pIdx);.  }.
fc60: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
fc70: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
fc80: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
fc90: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
fca0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
fcb0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
fcc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
fcd0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
fce0: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
fcf0: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
fd00: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
fd10: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
fd20: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
fd30: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
fd40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
fd50: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
fd60: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
fd70: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
fd80: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
fd90: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
fda0: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
fdb0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
fdc0: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
fdd0: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
fde0: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
fdf0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
fe00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
fe10: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
fe20: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
fe30: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
fe40: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
fe50: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
fe60: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
fe70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fe80: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
fe90: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
fea0: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
feb0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
fec0: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
fed0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
fee0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
fef0: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
ff00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
ff10: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
ff20: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
ff30: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
ff40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ff50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ff60: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
ff70: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
ff80: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
ff90: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
ffa0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
ffb0: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
ffc0: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
ffd0: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
ffe0: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
fff0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
10000 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
10010 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
10020 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
10030 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
10040 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
10050 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
10060 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
10070 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
10080 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
10090 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
100a0 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
100b0 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
100c0 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
100d0 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
100e0 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
100f0 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
10100 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
10110 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
10120 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
10130 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
10140 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
10150 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
10160 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
10170 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
10180 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
10190 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
101a0 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
101b0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
101c0 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
101d0 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
101e0 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
101f0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
10200 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
10210 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
10220 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
10230 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
10240 73 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57  st dest;    /* W
10250 68 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20  here the SELECT 
10260 73 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73  should store res
10270 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
10280 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20  t regYield;     
10290 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
102a0 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65  lding co-routine
102b0 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a   entry-point */.
102c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
102d0 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  p;        /* Top
102e0 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
102f0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
10300 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
10310 2f 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62  /* A record to b
10320 65 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68  e insert into th
10330 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
10340 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
10350 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  d;       /* Rowi
10360 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f  d of the next ro
10370 77 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  w to insert */. 
10380 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73       int addrIns
10390 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20  Loop;    /* Top 
103a0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
103b0 69 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a  inserting rows *
103c0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
103d0 53 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41  SelTab;     /* A
103e0 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63   table that desc
103f0 72 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54  ribes the SELECT
10400 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20   results */..   
10410 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b     regYield = ++
10420 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10430 20 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70      regRec = ++p
10440 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10450 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b     regRowid = ++
10460 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10470 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
10480 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
10490 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
104a0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
104b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
104c0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
104d0 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
104e0 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
104f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10500 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
10510 41 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20  AG_P2ISREG);.   
10520 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
10530 3d 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54  = 2;.      addrT
10540 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10550 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
10560 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
10570 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10580 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
10590 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64   regYield, 0, ad
105a0 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 69 66  drTop);.      if
105b0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
105c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70   return;.      p
105d0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
105e0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
105f0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10600 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
10610 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
10620 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
10630 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
10640 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
10650 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
10660 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
10670 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
10680 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
10690 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
106a0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
106b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
106c0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
106d0 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tab);.      sqli
106e0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
106f0 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72  t(&dest, SRT_Cor
10700 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
10710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10720 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10730 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
10740 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
10750 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
10760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10770 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
10780 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
10790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
107a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
107b0 70 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 61 64  p - 1);.      ad
107c0 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69  drInsLoop = sqli
107d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
107e0 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
107f0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
10800 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10820 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
10830 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73 74 2e  akeRecord, dest.
10840 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53 64 73  iSdst, dest.nSds
10850 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  t, regRec);.    
10860 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
10870 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30 29 3b  finity(v, p, 0);
10880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10890 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
108a0 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65 67 52  ewRowid, 1, regR
108b0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
108c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
108d0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20  , OP_Insert, 1, 
108e0 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64  regRec, regRowid
108f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10900 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
10910 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
10920 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10930 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f  ere(v, addrInsLo
10940 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
10950 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10960 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20  OP_Close, 1);.  
10970 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
10980 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
10990 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
109a0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
109b0 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
109c0 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
109d0 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
109e0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
109f0 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  lse{.      Token
10a00 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74   *pEnd2 = tabOpt
10a10 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61  s ? &pParse->sLa
10a20 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a  stToken : pEnd;.
10a30 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
10a40 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73  pEnd2->z - pPars
10a50 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
10a60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  ;.      if( pEnd
10a70 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e  2->z[0]!=';' ) n
10a80 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20   += pEnd2->n;.  
10a90 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
10aa0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
10ab0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10ac0 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
10ad0 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
10ae0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
10af0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
10b00 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
10b10 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
10b20 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
10b30 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
10b40 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
10b50 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
10b60 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
10b70 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
10b80 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
10b90 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
10ba0 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
10bb0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
10bc0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10bd0 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
10be0 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
10bf0 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
10c00 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
10c10 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
10c20 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
10c30 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
10c40 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
10c50 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
10c60 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
10c70 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
10c80 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
10c90 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
10ca0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
10cb0 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
10cc0 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
10cd0 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
10ce0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10cf0 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
10d00 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
10d10 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
10d20 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
10d30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
10d40 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
10d50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
10d60 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
10d70 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
10d80 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
10d90 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
10da0 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
10db0 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
10dc0 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
10dd0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
10de0 63 72 65 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20  crement)!=0 ){. 
10df0 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
10e00 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
10e10 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10e20 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10e30 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
10e40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10e50 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
10e60 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
10e70 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10e80 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10e90 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
10ea0 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
10eb0 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
10ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
10ed0 3e 7a 44 62 53 4e 61 6d 65 0a 20 20 20 20 20 20  >zDbSName.      
10ee0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
10ef0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
10f00 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
10f10 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
10f20 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
10f30 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
10f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10f50 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
10f60 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
10f70 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
10f80 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
10f90 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74  %q' AND type!='t
10fa0 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61  rigger'", p->zNa
10fb0 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  me));.  }...  /*
10fc0 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
10fd0 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
10fe0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
10ff0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
11000 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
11010 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
11020 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
11030 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
11040 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
11050 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
11060 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
11070 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
11080 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
11090 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
110a0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
110b0 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20   p->zName, p);. 
110c0 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
110d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
110e0 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
110f0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
11100 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
11110 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
11120 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
11130 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
11140 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
11150 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
11160 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62  = 0;.    db->mDb
11170 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
11180 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23  SchemaChange;..#
11190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
111a0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
111b0 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
111c0 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
111d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
111e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
111f0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
11200 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
11210 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
11220 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
11230 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
11240 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
11250 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
11260 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
11270 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
11280 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
11290 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
112a0 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
112b0 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
112c0 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
112d0 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
112e0 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
112f0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
11300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11310 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
11320 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
11330 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
11340 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
11350 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
11360 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
11370 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
11380 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
11390 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
113a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
113b0 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
113c0 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
113d0 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
113e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
113f0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
11400 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
11410 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
11420 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
11430 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
11440 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
11450 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
11460 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
11470 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11480 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f  CNames, /* Optio
11490 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77  nal list of view
114a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
114b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
114c0 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
114d0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
114e0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
114f0 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
11500 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
11510 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
11520 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
11530 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
11540 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
11550 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
11560 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
11570 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
11580 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
11590 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
115a0 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
115b0 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
115c0 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
115d0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62  e = 0;.  int iDb
115e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
115f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
11600 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
11610 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
11620 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11630 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
11640 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
11650 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67  n views");.    g
11660 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11670 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  fail;.  }.  sqli
11680 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
11690 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
116a0 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
116b0 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
116c0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
116d0 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
116e0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
116f0 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
11700 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74  ew_fail;.  sqlit
11710 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
11720 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11730 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
11740 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11750 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11760 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
11770 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
11780 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
11790 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
117a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
117b0 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
117c0 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20  pSelect) ) goto 
117d0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
117e0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
117f0 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
11800 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
11810 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11820 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
11830 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
11840 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
11850 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
11860 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
11870 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
11880 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
11890 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
118a0 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
118b0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
118c0 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
118d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
118e0 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
118f0 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
11900 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
11910 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 2d  OBJECT ){.    p-
11920 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  >pSelect = pSele
11930 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20  ct;.    pSelect 
11940 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11950 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
11960 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
11970 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
11980 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
11990 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20  }.  p->pCheck = 
119a0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
119b0 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20  up(db, pCNames, 
119c0 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
119d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
119e0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63  cFailed ) goto c
119f0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
11a00 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
11a10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
11a20 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
11a30 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
11a40 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
11a50 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
11a60 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
11a70 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  tToken;.  assert
11a80 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c  ( sEnd.z[0]!=0 |
11a90 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20  | sEnd.n==0 );. 
11aa0 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d   if( sEnd.z[0]!=
11ab0 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
11ac0 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
11ad0 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
11ae0 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
11af0 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
11b00 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
11b10 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
11b20 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
11b30 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
11b40 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
11b50 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
11b60 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
11b70 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
11b80 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
11b90 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
11ba0 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
11bb0 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
11bc0 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
11bd0 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
11be0 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f  );..create_view_
11bf0 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53  fail:.  sqlite3S
11c00 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
11c10 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
11c20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
11c30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
11c40 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d  enameExprlistUnm
11c50 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e 61 6d  ap(pParse, pCNam
11c60 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  es);.  }.  sqlit
11c70 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
11c80 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20  (db, pCNames);. 
11c90 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
11ca0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11cb0 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
11cc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11cd0 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
11ce0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11cf0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
11d00 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
11d10 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
11d20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
11d30 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
11d40 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
11d50 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
11d60 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
11d70 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
11d80 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
11d90 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
11da0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
11db0 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
11dc0 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
11dd0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
11de0 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
11df0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
11e00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
11e10 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
11e20 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
11e30 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
11e40 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
11e50 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
11e60 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
11e70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
11e80 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
11e90 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
11ea0 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
11eb0 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
11ec0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
11ed0 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
11ee0 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
11ef0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
11f00 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
11f10 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
11f20 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
11f30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11f40 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
11f50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11f60 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
11f70 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  rs */.#ifndef SQ
11f80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11f90 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b  LTABLE.  int rc;
11fa0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
11fb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
11fc0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69  ORIZATION.  sqli
11fd0 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
11fe0 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
11ff0 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f  xAuth pointer */
12000 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
12010 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
12020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12030 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
12040 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
12050 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ++;.  rc = sqlit
12060 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
12070 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12080 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61  );.  db->nSchema
12090 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63  Lock--;.  if( rc
120a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
120b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
120c0 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
120d0 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
120e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
120f0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
12100 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
12110 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
12120 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
12130 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
12140 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
12150 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
12160 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
12170 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
12180 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
12190 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
121a0 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
121b0 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
121c0 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
121d0 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
121e0 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
121f0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
12200 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
12210 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
12220 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
12230 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
12240 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
12250 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
12260 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
12270 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
12280 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
12290 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
122a0 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
122b0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
122c0 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
122d0 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
122e0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
122f0 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
12300 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
12310 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
12320 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
12330 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
12340 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
12350 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
12360 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
12370 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
12380 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
12390 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
123a0 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
123b0 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
123c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
123d0 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
123e0 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
123f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12400 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12410 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
12420 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
12430 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
12440 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
12450 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
12460 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
12470 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
12480 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
12490 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
124a0 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
124b0 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
124c0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
124d0 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
124e0 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
124f0 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
12500 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
12510 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
12520 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
12530 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
12540 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
12550 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
12560 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
12570 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
12580 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
12590 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
125a0 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
125b0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
125c0 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
125d0 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
125e0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
125f0 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
12600 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12610 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
12620 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
12630 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
12640 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
12650 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
12660 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
12670 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
12680 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72 73 65  LE.    u8 eParse
12690 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d 3e 65  Mode = pParse->e
126a0 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70  ParseMode;.    p
126b0 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64  Parse->eParseMod
126c0 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e  e = PARSE_MODE_N
126d0 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  ORMAL;.#endif.  
126e0 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
126f0 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
12700 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
12710 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
12720 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
12730 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
12740 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
12750 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69  e.bDisable++;.#i
12760 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12770 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12780 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
12790 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
127a0 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
127b0 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
127c0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
127d0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
127e0 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
127f0 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
12800 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
12810 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12820 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
12830 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50  );.#endif.    pP
12840 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
12850 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
12860 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  pCheck ){.      
12870 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
12880 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20  ame(arglist) AS 
12890 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ....      ** The
128a0 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
128b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
128c0 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  le are taken fro
128d0 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69  m.      ** argli
128e0 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72  st which is stor
128f0 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43  ed in pTable->pC
12900 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63  heck.  The pChec
12910 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a  k field.      **
12920 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20   normally holds 
12930 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
12940 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79  s on an ordinary
12950 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a   table, but for.
12960 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20        ** a VIEW 
12970 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73  it holds the lis
12980 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  t of column name
12990 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
129a0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
129b0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
129c0 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  rse, pTable->pCh
129d0 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e         &pTable->
12a00 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61  nCol, &pTable->a
12a10 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
12a20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12a30 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
12a40 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20  Parse->nErr==0. 
12a50 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d        && pTable-
12a60 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c  >nCol==pSel->pEL
12a70 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ist->nExpr.     
12a80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12a90 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75  te3SelectAddColu
12aa0 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
12ab0 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  on(pParse, pTabl
12ac0 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  e, pSel);.      
12ad0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
12ae0 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
12af0 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
12b00 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68  name AS...  with
12b10 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20  out an argument 
12b20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74  list.  Construct
12b30 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
12b40 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
12b50 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12b60 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
12b70 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20  s the view..    
12b80 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
12b90 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
12ba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
12bb0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
12bc0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
12bd0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
12be0 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
12bf0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
12c00 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
12c10 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
12c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
12c30 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
12c40 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62  Held(db, 0, pTab
12c50 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  le->pSchema) );.
12c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c70 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12c80 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  0;.      nErr++;
12c90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12ca0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
12cb0 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
12cc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
12cd0 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
12ce0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
12cf0 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66  .bDisable--;.#if
12d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12d10 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
12d20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f  pParse->eParseMo
12d30 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b  de = eParseMode;
12d40 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65  .#endif.  } else
12d50 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20   {.    nErr++;. 
12d60 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63   }.  pTable->pSc
12d70 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67  hema->schemaFlag
12d80 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56  s |= DB_UnresetV
12d90 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e  iews;.  if( db->
12da0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12db0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
12dc0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
12dd0 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 54   pTable);.    pT
12de0 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
12df0 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
12e00 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
12e10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12e20 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
12e30 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
12e40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
12e50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
12e60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
12e70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12e80 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
12e90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12ea0 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
12eb0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
12ec0 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
12ed0 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
12ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12ef0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12f00 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
12f10 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
12f20 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
12f30 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12f40 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
12f50 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
12f60 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
12f70 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
12f80 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
12f90 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
12fa0 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
12fb0 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
12fc0 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
12fd0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
12fe0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
12ff0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
13000 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
13010 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
13020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
13030 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
13040 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
13050 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b   pTab->aCol = 0;
13060 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
13070 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
13080 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
13090 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
130a0 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
130b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
130c0 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
130d0 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
130e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
130f0 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
13100 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
13110 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
13120 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
13130 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
13140 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
13150 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
13160 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
13170 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
13180 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
13190 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
131a0 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
131b0 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
131c0 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
131d0 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
131e0 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
131f0 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
13200 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
13210 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
13220 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
13230 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
13240 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
13250 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
13260 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
13270 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
13280 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
13290 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
132a0 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
132b0 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
132c0 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
132d0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
132e0 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
132f0 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
13300 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
13310 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
13320 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
13330 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
13340 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
13350 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
13360 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
13370 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
13380 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
13390 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
133a0 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
133b0 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
133c0 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
133d0 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
133e0 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
133f0 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
13400 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
13410 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
13420 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
13430 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
13440 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
13450 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
13460 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
13470 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13480 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
13490 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
134a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
134b0 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c   iDb, int iFrom,
134c0 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
134d0 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
134e0 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44  Hash *pHash;.  D
134f0 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
13500 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
13510 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
13520 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d  b, 0) );.  pDb =
13530 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
13540 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
13550 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
13560 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13570 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
13580 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
13590 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
135a0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
135b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
135c0 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
135d0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
135e0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
135f0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
13600 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
13610 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
13620 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
13630 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
13640 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
13650 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
13660 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13670 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
13680 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
13690 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
136a0 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
136b0 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
136c0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
136d0 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
136e0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
136f0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
13700 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
13710 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
13720 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
13730 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
13740 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
13750 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
13760 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
13770 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
13780 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
13790 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
137a0 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
137b0 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
137c0 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
137d0 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
137e0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
137f0 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
13800 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
13810 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
13820 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
13830 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
13840 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
13850 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
13860 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13870 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
13880 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13890 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
138a0 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20 73 71  f( iTable<2 ) sq
138b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
138c0 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 73  arse, "corrupt s
138d0 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74  chema");.  sqlit
138e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
138f0 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
13900 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
13910 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
13920 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
13930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13940 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
13950 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
13960 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
13970 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
13980 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
13990 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
139a0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
139b0 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
139c0 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
139d0 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
139e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
139f0 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
13a00 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
13a10 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
13a20 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
13a30 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
13a40 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
13a50 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
13a60 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
13a70 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
13a80 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
13a90 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
13aa0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
13ab0 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
13ac0 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
13ad0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
13ae0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
13af0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
13b00 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
13b10 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
13b20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
13b30 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
13b40 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
13b50 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
13b60 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
13b70 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54   MASTER_NAME, iT
13b80 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
13b90 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
13ba0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13bb0 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
13bc0 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
13bd0 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
13be0 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
13bf0 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
13c00 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
13c10 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
13c20 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
13c30 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
13c40 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
13c50 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
13c60 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
13c70 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
13c80 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
13c90 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
13ca0 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
13cb0 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
13cc0 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
13cd0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
13ce0 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
13cf0 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
13d00 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13d10 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
13d20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
13d30 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
13d40 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
13d50 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
13d60 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
13d70 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
13d80 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
13d90 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
13da0 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
13db0 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
13dc0 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
13dd0 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
13de0 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
13df0 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
13e00 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
13e10 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
13e20 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
13e30 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
13e40 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
13e50 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
13e60 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
13e70 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
13e80 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
13e90 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
13ea0 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
13eb0 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
13ec0 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
13ed0 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
13ee0 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
13ef0 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
13f00 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
13f10 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
13f20 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
13f30 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
13f40 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
13f50 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
13f60 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
13f70 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
13f80 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
13f90 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
13fa0 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
13fb0 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
13fc0 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
13fd0 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
13fe0 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
13ff0 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
14000 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
14010 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
14020 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
14030 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
14040 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
14050 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
14060 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
14070 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
14080 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
14090 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
140a0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
140b0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
140c0 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
140d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
140e0 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
140f0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
14100 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
14110 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
14120 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
14130 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
14140 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
14150 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
14160 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
14170 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
14180 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
14190 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
141a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
141b0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
141c0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
141d0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
141e0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
141f0 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
14200 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
14210 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
14220 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
14230 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
14240 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
14250 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14260 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
14270 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
14280 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
14290 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
142a0 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
142b0 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
142c0 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
142d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
142e0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
142f0 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
14300 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
14310 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
14320 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
14330 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
14340 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
14350 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
14360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
14370 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
14380 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
14390 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
143a0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
143b0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
143c0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
143d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
143e0 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
143f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
14400 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
14410 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
14420 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
14430 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
14440 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
14450 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
14460 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
14470 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
14480 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
14490 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
144a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
144b0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
144c0 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
144d0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
144e0 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
144f0 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
14500 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
14510 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
14520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14530 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
14540 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
14550 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
14560 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
14570 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
14580 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
14590 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
145a0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
145b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
145c0 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
145d0 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
145e0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
145f0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14600 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14610 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
14620 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14630 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14640 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
14650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14660 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
14670 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14680 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
14690 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
146a0 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
146b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
146c0 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
146d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
146e0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
146f0 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
14700 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
14710 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
14720 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
14730 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
14740 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
14750 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
14760 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
14770 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
14780 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
14790 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
147a0 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
147b0 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
147c0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
147d0 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
147e0 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
147f0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
14800 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
14810 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
14820 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
14830 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
14840 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
14850 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
14860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14870 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
14880 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
14890 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
148a0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
148b0 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
148c0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
148d0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
148e0 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
148f0 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
14900 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
14910 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
14920 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
14930 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
14940 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
14950 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
14960 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
14970 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
14980 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
14990 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
149a0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
149b0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
149c0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
149d0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
149e0 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
149f0 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
14a00 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
14a10 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
14a20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70  pDb->zDbSName, p
14a30 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
14a40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14a50 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
14a60 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
14a70 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
14a80 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
14a90 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
14aa0 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
14ab0 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
14ac0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
14ad0 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
14ae0 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
14af0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
14b00 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
14b10 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
14b20 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
14b30 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
14b40 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
14b50 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
14b60 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
14b70 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
14b80 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
14b90 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
14ba0 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
14bb0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
14bc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
14bd0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
14be0 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
14bf0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
14c00 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
14c10 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
14c20 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
14c30 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
14c40 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ME, pTab->zName)
14c50 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
14c60 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
14c70 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
14c80 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
14c90 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
14ca0 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
14cb0 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
14cc0 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
14cd0 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
14ce0 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
14cf0 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
14d00 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
14d10 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
14d20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14d30 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
14d40 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
14d50 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
14d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14d70 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
14d80 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14d90 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14da0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
14db0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
14dc0 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
14dd0 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
14de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14df0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14e00 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
14e10 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
14e20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
14e30 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
14e40 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
14e50 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
14e60 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
14e70 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
14e80 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
14e90 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
14ea0 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
14eb0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
14ec0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
14ed0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14ee0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
14ef0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14f00 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
14f10 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14f20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14f30 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
14f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
14f50 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
14f60 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
14f70 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
14f80 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14f90 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45  table;.  if( noE
14fa0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
14fb0 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74  sErr++;.  assert
14fc0 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69  ( isView==0 || i
14fd0 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49  sView==LOCATE_VI
14fe0 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  EW );.  pTab = s
14ff0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
15000 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
15010 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
15020 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
15030 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
15040 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
15050 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
15060 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
15070 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
15080 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
15090 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
150a0 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
150b0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
150c0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
150d0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
150e0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
150f0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
15100 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
15110 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
15120 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
15130 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
15140 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
15150 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
15160 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
15170 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
15180 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
15190 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
151a0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
151b0 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
151c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
151d0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
151e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
151f0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
15200 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
15210 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15220 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
15230 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
15240 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
15250 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
15260 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  SName;.    const
15270 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
15280 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15290 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
152a0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
152b0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
152c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
152d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
152e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
152f0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
15300 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
15310 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
15320 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15330 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
15340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15350 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
15360 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
15370 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
15380 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15390 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
153a0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
153b0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
153c0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
153d0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
153e0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
153f0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
15400 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
15410 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
15420 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
15430 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
15440 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
15450 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
15460 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
15470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15480 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15490 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
154a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
154b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
154c0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
154d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
154e0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
154f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15500 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
15510 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15520 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15530 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
15540 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
15550 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
15560 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
15570 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
15580 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
15590 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
155a0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
155b0 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
155c0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
155d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
155e0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
155f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15600 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15610 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
15620 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
15630 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15640 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15650 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
15660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15670 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
15680 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
15690 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
156a0 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
156b0 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
156c0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
156d0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
156e0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
156f0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
15700 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15710 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
15720 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
15730 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
15740 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
15750 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
15770 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
15780 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
15790 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
157a0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
157b0 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
157c0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
157d0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
157e0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
157f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15800 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15810 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
15820 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
15830 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
15840 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
15850 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15860 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15870 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
15880 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
15890 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
158a0 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56  b);.    if( !isV
158b0 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
158c0 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
158d0 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
158e0 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
158f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
15900 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
15910 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
15920 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
15930 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
15940 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
15950 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a  , iDb, isView);.
15960 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74    }..exit_drop_t
15970 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
15980 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
15990 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
159a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
159b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
159c0 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
159d0 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
159e0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
159f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15a00 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
15a10 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
15a20 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
15a30 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
15a40 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
15a50 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
15a60 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
15a70 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
15a80 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
15a90 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
15aa0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
15ab0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
15ac0 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61  ferred to (a.k.a
15ad0 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61   the "parent" ta
15ae0 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73  ble).  pToCol is
15af0 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61   a list.** of ta
15b00 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65  bles in the pare
15b10 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66  nt pTo table.  f
15b20 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
15b30 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
15b40 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
15b50 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
15b60 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
15b70 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
15b80 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
15b90 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
15ba0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
15bb0 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
15bc0 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
15bd0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
15be0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
15bf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15c00 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
15c10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
15c20 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ld..**.** The fo
15c30 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
15c40 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
15c50 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
15c60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
15c70 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
15c80 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
15c90 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
15ca0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
15cb0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
15cc0 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
15cd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15ce0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15cf0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
15d00 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
15d10 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
15d20 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
15d30 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
15d40 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
15d50 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
15d60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
15d70 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
15d80 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
15d90 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
15da0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
15db0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
15dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
15dd0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
15de0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
15df0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
15e00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
15e10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15e20 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15e30 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
15e40 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74  0;.  FKey *pNext
15e50 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  To;.  Table *p =
15e60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15e70 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
15e80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
15e90 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
15ea0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
15eb0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
15ec0 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
15ed0 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
15ee0 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
15ef0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
15f00 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
15f10 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
15f20 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66  iCol<0) ) goto f
15f30 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
15f40 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
15f50 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
15f60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15f70 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
15f80 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
15f90 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
15fa0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
15fb0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
15fc0 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
15fd0 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
15fe0 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
15ff0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
16000 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
16010 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
16020 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
16030 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
16040 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
16050 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16060 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
16070 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
16080 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
16090 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
160a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
160b0 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
160c0 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
160d0 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
160e0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
160f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
16100 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
16110 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
16120 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
16130 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
16140 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
16150 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
16160 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
16170 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16180 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
16190 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
161a0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
161b0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
161c0 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
161d0 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
161e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
161f0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
16200 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
16210 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
16220 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
16230 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
16240 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
16250 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
16260 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e   (char*)&pFKey->
16270 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46  aCol[nCol];.  pF
16280 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
16290 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
162a0 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  JECT ){.    sqli
162b0 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
162c0 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
162d0 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20  )z, pTo);.  }.  
162e0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
162f0 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
16300 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  To->n] = 0;.  sq
16310 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
16320 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
16330 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
16340 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
16350 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
16360 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
16370 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
16380 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
16390 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
163a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
163b0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
163c0 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
163d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
163e0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
163f0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
16400 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
16410 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
16420 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
16430 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
16440 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16460 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
16470 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
16480 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16490 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
164a0 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
164b0 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
164c0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
164d0 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
164e0 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
164f0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
16500 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16520 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
16530 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
16540 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
16550 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26  nRemap(pParse, &
16560 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20  pFKey->aCol[i], 
16570 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
16580 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
16590 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
165a0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
165b0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
165c0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
165d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
165e0 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
165f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
16600 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
16610 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20   = z;.      if( 
16620 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
16630 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16640 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
16650 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70  map(pParse, z, p
16660 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16670 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16680 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
16690 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
166a0 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
166b0 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
166c0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
166d0 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
166e0 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
166f0 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38  aAction[0] = (u8
16700 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b  )(flags & 0xff);
16710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16720 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20  N DELETE action 
16730 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  */.  pFKey->aAct
16740 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66  ion[1] = (u8)((f
16750 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
16760 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50  ff);    /* ON UP
16770 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a  DATE action */..
16780 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16790 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
167a0 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65  (db, 0, p->pSche
167b0 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f  ma) );.  pNextTo
167c0 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74   = (FKey *)sqlit
167d0 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
167e0 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61  >pSchema->fkeyHa
167f0 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79  sh, .      pFKey
16800 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70  ->zTo, (void *)p
16810 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  FKey.  );.  if( 
16820 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29  pNextTo==pFKey )
16830 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  {.    sqlite3Oom
16840 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67  Fault(db);.    g
16850 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
16860 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b    if( pNextTo ){
16870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
16880 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30  xtTo->pPrevTo==0
16890 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70   );.    pFKey->p
168a0 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f  NextTo = pNextTo
168b0 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70  ;.    pNextTo->p
168c0 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a  PrevTo = pFKey;.
168d0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
168e0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
168f0 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
16900 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
16910 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
16920 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
16930 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
16940 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16950 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
16960 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
16970 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
16980 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
16990 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
169a0 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
169b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
169c0 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
169d0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
169e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
169f0 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
16a00 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
16a10 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
16a20 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
16a30 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
16a40 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
16a50 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
16a60 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
16a70 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
16a80 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
16a90 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
16aa0 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
16ab0 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
16ac0 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
16ad0 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
16ae0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
16af0 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
16b00 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
16b10 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
16b20 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
16b30 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
16b40 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
16b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
16b60 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
16b70 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
16b80 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
16b90 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
16ba0 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
16bb0 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
16bc0 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
16bd0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
16be0 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
16bf0 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20  ferred==1 ); /* 
16c00 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31  EV: R-30323-2191
16c10 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73  7 */.  pFKey->is
16c20 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
16c30 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
16c40 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
16c50 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
16c60 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
16c70 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
16c80 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
16c90 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
16ca0 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
16cb0 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
16cc0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
16cd0 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
16ce0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
16cf0 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
16d00 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
16d10 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
16d20 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
16d30 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
16d40 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
16d50 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
16d60 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
16d70 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
16d80 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
16d90 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
16da0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
16db0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
16dc0 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
16dd0 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
16de0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
16df0 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
16e00 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
16e10 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
16e20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
16e30 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
16e40 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
16e50 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
16e60 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
16e70 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
16e80 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
16e90 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
16ea0 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
16eb0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
16ec0 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
16ed0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
16ee0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
16ef0 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
16f00 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
16f10 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
16f20 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
16f30 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
16f40 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
16f50 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
16f60 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
16f70 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b  /.  int iSorter;
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
16fa0 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65  ned by OpenSorte
16fb0 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f  r (if in use) */
16fc0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
16ff0 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
17000 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20   int addr2;     
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75  /* Address to ju
17030 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69  mp to for next i
17040 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  teration */.  in
17050 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17070 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
17080 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ex */.  int iPar
17090 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20  tIdxLabel;      
170a0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74         /* Jump t
170b0 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20  o this label to 
170c0 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20  skip a row */.  
170d0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
170f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17100 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
17110 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
17120 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17140 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
17150 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ex */.  int regR
17160 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
17170 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
17180 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
17190 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  bled index recor
171a0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
171b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
171c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
171d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
171e0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
171f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
17200 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
17210 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
17220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17230 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
17240 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
17250 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
17260 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e  ITE_REINDEX, pIn
17270 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20  dex->zName, 0,. 
17280 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17290 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a  ].zDbSName ) ){.
172a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
172b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
172c0 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
172d0 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
172e0 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
172f0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
17300 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
17310 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
17320 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
17330 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
17340 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
17350 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
17360 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
17370 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
17380 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
17390 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
173a0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
173b0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
173c0 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
173d0 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
173e0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
173f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
17400 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
17410 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
17420 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f  se->nErr );..  /
17430 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
17440 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
17450 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
17460 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
17470 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
17480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17490 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
174a0 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
174b0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  pIndex->nKeyCol,
174c0 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20   (char*).       
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
174e0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
174f0 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Key), P4_KEYINFO
17500 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
17510 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68  e table. Loop th
17520 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f  rough all rows o
17530 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73  f the table, ins
17540 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a  erting index.  *
17550 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74  * records into t
17560 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
17570 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
17580 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
17590 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
175a0 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20  nRead);.  addr1 
175b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
175c0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
175d0 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65  , iTab, 0); Vdbe
175e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72  Coverage(v);.  r
175f0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
17600 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17610 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  rse);.  sqlite3M
17620 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65  ultiWrite(pParse
17630 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  );..  sqlite3Gen
17640 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
17650 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62  arse,pIndex,iTab
17660 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50  ,regRecord,0,&iP
17670 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29  artIdxLabel,0,0)
17680 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
176a0 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65  erInsert, iSorte
176b0 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
176c0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
176d0 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
176e0 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65  se, iPartIdxLabe
176f0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
17700 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
17710 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
17720 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
17730 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
17740 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
17750 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
17760 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
17770 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17780 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
17790 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
177a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
177b0 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
177c0 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177e0 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
177f0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
17800 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17810 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
17820 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
17830 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
17840 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64  ISREG:0));..  ad
17850 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
17860 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
17870 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65  rterSort, iSorte
17880 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
17890 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73  age(v);.  if( Is
178a0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
178b0 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ex) ){.    int j
178c0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  2 = sqlite3VdbeG
178d0 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61  oto(v, 1);.    a
178e0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
178f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17910 65 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65  eVerifyAbortable
17920 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20  (v, OE_Abort);. 
17930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17940 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f  dOp4Int(v, OP_So
17950 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f  rterCompare, iSo
17960 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63  rter, j2, regRec
17970 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ord,.           
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17990 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20  ndex->nKeyCol); 
179a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
179b0 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71  .    sqlite3Uniq
179c0 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ueConstraint(pPa
179d0 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70  rse, OE_Abort, p
179e0 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
179f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17a00 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, j2);.  }else{
17a10 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
17a20 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
17a30 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  ddr(v);.  }.  sq
17a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17a50 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
17a60 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
17a70 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73  cord, iIdx);.  s
17a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17a90 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20  (v, OP_SeekEnd, 
17aa0 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
17ab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17ac0 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
17ad0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
17ae0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17af0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
17b00 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
17b10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17b20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
17b30 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
17b40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17b50 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
17b60 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b  iSorter, addr2);
17b70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17b80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
17b90 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
17ba0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
17bb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
17bc0 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71  ose, iTab);.  sq
17bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17be0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
17bf0 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
17c00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
17c10 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d  ose, iSorter);.}
17c20 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
17c30 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68   heap space to h
17c40 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a  old an Index obj
17c50 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f  ect with nCol co
17c60 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63  lumns..**.** Inc
17c70 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61  rease the alloca
17c80 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f  tion size to pro
17c90 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45  vide an extra nE
17ca0 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66  xtra bytes.** of
17cb0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
17cc0 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
17cd0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64  Index object and
17ce0 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   return a.** poi
17cf0 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74  nter to this ext
17d00 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45  ra space in *ppE
17d10 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  xtra..*/.Index *
17d20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
17d30 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71  ndexObject(.  sq
17d40 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
17d50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
17d60 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
17d70 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  16 nCol,        
17d80 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
17d90 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
17da0 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
17db0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
17dc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17dd0 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72  of bytes of extr
17de0 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  a space to alloc
17df0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45   */.  char **ppE
17e00 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f  xtra       /* Po
17e10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78  inter to the "ex
17e20 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b  tra" space */.){
17e30 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  .  Index *p;    
17e40 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
17e50 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63  ated index objec
17e60 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
17e70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
17e80 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
17e90 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b  r Index object +
17ea0 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42   arrays */..  nB
17eb0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
17ec0 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20  eof(Index)) +   
17ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17ee0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a  dex structure  *
17ef0 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e  /.          ROUN
17f00 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  D8(sizeof(char*)
17f10 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20  *nCol) +        
17f20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
17f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17f40 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
17f50 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
17f60 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e   +     /* Index.
17f70 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f  aiRowLogEst   */
17f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f90 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43    sizeof(i16)*nC
17fa0 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
17fb0 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
17fc0 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  n   */.         
17fd0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75          sizeof(u
17fe0 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20  8)*nCol);       
17ff0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
18000 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70  SortOrder */.  p
18010 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
18020 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
18030 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66   + nExtra);.  if
18040 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ( p ){.    char 
18050 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  *pExtra = ((char
18060 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)+ROUND8(size
18070 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
18080 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  p->azColl = (con
18090 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61  st char**)pExtra
180a0 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e  ; pExtra += ROUN
180b0 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  D8(sizeof(char*)
180c0 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  *nCol);.    p->a
180d0 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f  iRowLogEst = (Lo
180e0 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45  gEst*)pExtra; pE
180f0 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c  xtra += sizeof(L
18100 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b  ogEst)*(nCol+1);
18110 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  .    p->aiColumn
18120 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b   = (i16*)pExtra;
18130 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d         pExtra +=
18140 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
18150 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  l;.    p->aSortO
18160 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74  rder = (u8*)pExt
18170 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75  ra;.    p->nColu
18180 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70  mn = nCol;.    p
18190 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c  ->nKeyCol = nCol
181a0 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74   - 1;.    *ppExt
181b0 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20  ra = ((char*)p) 
181c0 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  + nByte;.  }.  r
181d0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
181e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
181f0 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
18200 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
18210 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
18220 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
18230 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
18240 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
18250 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
18260 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
18270 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
18280 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
18290 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
182a0 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
182b0 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
182c0 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
182d0 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
182e0 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
182f0 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
18300 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
18310 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
18320 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
18330 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
18340 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
18350 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
18360 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
18370 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
18380 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
18390 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
183a0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
183b0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
183c0 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
183d0 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
183e0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
183f0 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
18400 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
18410 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
18420 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
18430 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
18440 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
18450 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
18460 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
18470 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18480 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
18490 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
184a0 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
184b0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
184c0 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
184d0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
184e0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
184f0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
18500 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
18510 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
18520 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18530 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
18540 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
18550 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
18560 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
18570 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
18580 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
18590 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
185a0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
185b0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
185c0 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
185d0 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
185e0 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
185f0 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
18600 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
18610 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
18620 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
18630 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
18640 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20  Expr *pPIWhere, 
18650 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
18660 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69  se for partial i
18670 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
18680 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
18690 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
186a0 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
186b0 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
186c0 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
186d0 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72  ,    /* Omit err
186e0 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
186f0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
18700 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20 20  u8 idxType      
18710 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18720 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  type */.){.  Tab
18730 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
18740 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
18750 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
18760 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b  dex *pIndex = 0;
18770 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
18780 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
18790 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
187a0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20   0;     /* Name 
187b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
187c0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
187d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
187e0 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
187f0 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  n zName */.  int
18800 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72   i, j;.  DbFixer
18810 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a   sFix;        /*
18820 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
18830 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
18840 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
18850 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20   sortOrderMask; 
18860 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20    /* 1 to honor 
18870 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20  DESC in index.  
18880 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a  0 to ignore. */.
18890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
188a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62  pParse->db;.  Db
188b0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
188c0 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66     /* The specif
188d0 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  ic table contain
188e0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20  ing the indexed 
188f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
18900 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
18910 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
18920 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
18930 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
18940 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
18950 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  ame = 0;    /* U
18960 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
18970 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
18980 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75  create */.  stru
18990 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
189a0 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20   *pListItem; /* 
189b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
189c0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
189d0 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  nExtra = 0;     
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
189f0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
18a00 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a  for zExtra[] */.
18a10 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b    int nExtraCol;
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18a40 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65  extra columns ne
18a50 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eded */.  char *
18a60 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  zExtra = 0;     
18a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
18a80 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20  tra space after 
18a90 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
18aa0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b   */.  Index *pPk
18ab0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52   = 0;      /* PR
18ac0 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
18ad0 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
18ae0 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69  D tables */..  i
18af0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
18b00 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
18b10 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74  Err>0 ){.    got
18b20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18b30 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  dex;.  }.  if( I
18b40 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26  N_DECLARE_VTAB &
18b50 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54  & idxType!=SQLIT
18b60 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
18b70 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f  YKEY ){.    goto
18b80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18b90 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51  ex;.  }.  if( SQ
18ba0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
18bb0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
18bc0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
18bd0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
18bf0 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
18c00 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
18c10 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
18c20 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
18c30 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
18c40 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
18c50 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
18c60 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
18c70 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
18c80 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
18c90 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
18ca0 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
18cb0 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
18cc0 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
18cd0 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
18ce0 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
18cf0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18d00 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
18d10 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
18d20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
18d30 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
18d40 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
18d50 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
18d60 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
18d70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18d80 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26   assert( pName &
18d90 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23  & pName->z );..#
18da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18db0 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a  IT_TEMPDB.    /*
18dc0 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
18dd0 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
18de0 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
18df0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
18e00 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
18e10 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
18e20 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20  tabase to 1. Do 
18e30 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20  not do this.    
18e40 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69  ** if initialisi
18e50 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ng a database sc
18e60 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  hema..    */.   
18e70 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
18e80 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61  usy ){.      pTa
18e90 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
18ea0 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
18eb0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
18ec0 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d    if( pName2->n=
18ed0 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
18ee0 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
18ef0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
18f00 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  ){.        iDb =
18f10 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18f20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  }.#endif..    sq
18f30 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
18f40 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
18f50 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
18f60 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18f70 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
18f80 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a  x, pTblName) ){.
18f90 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
18fa0 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
18fb0 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
18fc0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
18fd0 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
18fe0 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
18ff0 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
19000 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
19010 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
19020 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
19030 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
19040 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62  (pParse, 0, &pTb
19050 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  lName->a[0]);.  
19060 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
19070 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c  llocFailed==0 ||
19080 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20   pTab==0 );.    
19090 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
190a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
190b0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44  ndex;.    if( iD
190c0 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b  b==1 && db->aDb[
190d0 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54  iDb].pSchema!=pT
190e0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
190f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
19100 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
19110 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
19120 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69   create a TEMP i
19130 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50  ndex on non-TEMP
19140 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a   table \"%s\"",.
19150 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
19160 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  >zName);.      g
19170 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19180 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19190 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
191a0 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c  Tab) ) pPk = sql
191b0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
191c0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c  dex(pTab);.  }el
191d0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
191e0 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
191f0 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d  assert( pStart==
19200 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
19210 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
19220 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
19230 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19240 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
19250 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
19260 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
19270 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
19280 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
19290 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65  Db[iDb];..  asse
192a0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
192b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
192c0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
192d0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
192e0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
192f0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
19300 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69  .       && db->i
19310 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20  nit.busy==0.#if 
19320 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
19330 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
19340 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72    && sqlite3User
19350 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e  AuthTable(pTab->
19360 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66  zName)==0.#endif
19370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41  .#ifdef SQLITE_A
19380 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54  LLOW_SQLITE_MAST
19390 45 52 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20  ER_INDEX.       
193a0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
193b0 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
193c0 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d 30 0a 23  ],"master")!=0.#
193d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20  endif.       && 
193e0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
193f0 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
19400 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
19410 30 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  0. ){.    sqlite
19420 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19430 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
19440 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
19450 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
19460 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19470 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
19480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19490 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
194a0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
194b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
194c0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
194d0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
194e0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
194f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19500 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
19510 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19520 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
19530 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
19540 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
19550 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19560 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
19570 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
19580 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
19590 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
195a0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
195b0 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
195c0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
195d0 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
195e0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
195f0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
19600 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
19610 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
19620 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
19630 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
19640 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
19650 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
19660 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
19670 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
19680 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
19690 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
196a0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
196b0 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
196c0 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
196d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
196e0 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
196f0 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
19700 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
19710 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
19720 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
19730 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
19740 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
19750 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
19760 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
19770 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
19780 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
19790 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
197a0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
197b0 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
197c0 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
197d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
197e0 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
197f0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19800 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
19810 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
19820 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
19830 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19840 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
19850 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
19860 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
19870 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
19880 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
19890 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
198a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
198b0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
198c0 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
198d0 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ECT ){.      if(
198e0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
198f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
19900 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
19910 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
19920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
19930 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19940 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
19950 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
19960 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
19970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
19980 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19990 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dex;.        }. 
199a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
199b0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
199c0 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
199d0 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29  ->zDbSName)!=0 )
199e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  {.        if( !i
199f0 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
19a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
19a10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19a20 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
19a30 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
19a40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
19a50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19a60 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
19a70 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  y );.          s
19a80 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
19a90 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
19aa0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Db);.        }. 
19ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
19ac0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19ae0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
19af0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
19b00 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
19b10 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
19b20 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
19b30 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
19b40 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
19b50 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
19b60 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
19b70 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
19b80 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
19b90 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
19ba0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
19bb0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19bc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19bd0 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  Automatic index 
19be0 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20  names generated 
19bf0 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69  from within sqli
19c00 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
19c10 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68  ().    ** must h
19c20 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61  ave names that a
19c30 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d  re distinct from
19c40 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69   normal automati
19c50 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20  c index names.. 
19c60 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
19c70 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ing statement co
19c80 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f  nverts "sqlite3_
19c90 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  autoindex..." in
19ca0 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74  to.    ** "sqlit
19cb0 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_butoindex..."
19cc0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
19cd0 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74  e the names dist
19ce0 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  inct..    ** The
19cf0 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22   "vtab_err.test"
19d00 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74   test demonstrat
19d10 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74  es the need of t
19d20 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  his statement. *
19d30 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 53 50 45  /.    if( IN_SPE
19d40 43 49 41 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61  CIAL_PARSE ) zNa
19d50 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  me[7]++;.  }..  
19d60 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
19d70 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
19d80 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
19d90 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
19da0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
19db0 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f  ATION.  if( !IN_
19dc0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
19dd0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19de0 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53  *zDb = pDb->zDbS
19df0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
19e00 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19e10 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
19e20 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
19e30 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
19e40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
19e50 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
19e70 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
19e80 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
19e90 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
19ea0 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
19eb0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
19ec0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
19ed0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
19ee0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
19ef0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
19f00 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
19f10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
19f30 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
19f40 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
19f50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
19f60 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
19f70 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
19f80 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
19f90 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
19fa0 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
19fb0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
19fc0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
19fd0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
19fe0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
19ff0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
1a000 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72   ){.    Token pr
1a010 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d  evCol;.    Colum
1a020 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d  n *pCol = &pTab-
1a030 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
1a040 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  -1];.    pCol->c
1a050 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
1a060 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 73  AG_UNIQUE;.    s
1a070 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
1a080 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e  &prevCol, pCol->
1a090 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
1a0a0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1a0b0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1a0c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1a0d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
1a0e0 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26  loc(db, TK_ID, &
1a0f0 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20  prevCol, 0));.  
1a100 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1a110 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a120 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
1a130 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
1a140 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  r==1 );.    sqli
1a150 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
1a160 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73  rtOrder(pList, s
1a170 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c  ortOrder);.  }el
1a180 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1a190 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
1a1a0 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  th(pParse, pList
1a1b0 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a  , "index");.  }.
1a1c0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1a1d0 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
1a1e0 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
1a1f0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
1a200 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
1a210 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
1a220 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
1a230 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
1a240 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1a250 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
1a260 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
1a270 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
1a280 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
1a290 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  =0 );.    if( pE
1a2a0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
1a2b0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ATE ){.      nEx
1a2c0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
1a2d0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
1a2e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20  r->u.zToken));. 
1a2f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
1a300 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
1a310 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
1a320 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
1a330 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1a340 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78  30(zName);.  nEx
1a350 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70  traCol = pPk ? p
1a360 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b  Pk->nKeyCol : 1;
1a370 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1a380 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
1a390 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74  Object(db, pList
1a3a0 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61  ->nExpr + nExtra
1a3b0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65             nName
1a3e0 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26   + nExtra + 1, &
1a3f0 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64  zExtra);.  if( d
1a400 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a410 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1a420 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a430 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
1a440 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1a450 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  T(pIndex->aiRowL
1a460 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  ogEst) );.  asse
1a470 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1a480 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
1a490 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
1a4a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45  ndex->zName = zE
1a4b0 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
1a4c0 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d  = nName + 1;.  m
1a4d0 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
1a4e0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
1a4f0 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
1a500 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
1a510 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1a520 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
1a530 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1a540 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21  tNull = onError!
1a550 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64  =OE_None;.  pInd
1a560 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64  ex->idxType = id
1a570 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d  xType;.  pIndex-
1a580 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
1a590 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
1a5a0 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  .  pIndex->nKeyC
1a5b0 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
1a5c0 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72  r;.  if( pPIWher
1a5d0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a5e0 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
1a5f0 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
1a600 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70  b, NC_PartIdx, p
1a610 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  PIWhere, 0);.   
1a620 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
1a630 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72  xWhere = pPIWher
1a640 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20  e;.    pPIWhere 
1a650 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
1a660 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1a670 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1a680 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  b, 0) );..  /* C
1a690 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
1a6a0 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
1a6b0 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
1a6c0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
1a6d0 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
1a6e0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1a6f0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
1a700 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
1a710 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
1a720 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1a730 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
1a740 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
1a750 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
1a760 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c  /* Analyze the l
1a770 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
1a780 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
1a790 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
1a7a0 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70  dex and.  ** rep
1a7b0 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20  ort any errors. 
1a7c0 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   In the common c
1a7d0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78  ase where the ex
1a7e0 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63  pression is exac
1a7f0 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65  tly.  ** a table
1a800 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74   column, store t
1a810 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69  hat column in ai
1a820 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67  Column[].  For g
1a830 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f  eneral expressio
1a840 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74  ns,.  ** populat
1a850 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  e pIndex->aColEx
1a860 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f  pr and store XN_
1a870 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43  EXPR (-2) in aiC
1a880 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20  olumn[]..  **.  
1a890 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1a8a0 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20   warning if two 
1a8b0 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
1a8c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  of the index are
1a8d0 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
1a8e0 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77   TODO: Issue a w
1a8f0 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61  arning if the ta
1a900 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ble primary key 
1a910 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
1a920 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  of the.  ** inde
1a930 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c  x key..  */.  pL
1a940 69 73 74 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d  istItem = pList-
1a950 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  >a;.  if( IN_REN
1a960 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a970 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
1a980 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  pr = pList;.    
1a990 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pList = 0;.  }. 
1a9a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
1a9b0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  ex->nKeyCol; i++
1a9c0 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
1a9d0 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
1a9e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a9f0 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69     /* The i-th i
1aa00 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
1aa10 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  */.    int reque
1aa20 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20  stedSortOrder;  
1aa30 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20        /* ASC or 
1aa40 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68  DESC on the i-th
1aa50 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1aa60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1aa70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1aa80 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
1aa90 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1aaa0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69  .    sqlite3Stri
1aab0 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d  ngToId(pListItem
1aac0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
1aad0 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1aae0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1aaf0 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78  , pTab, NC_IdxEx
1ab00 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  pr, pListItem->p
1ab10 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Expr, 0);.    if
1ab20 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1ab30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ab40 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45  e_index;.    pCE
1ab50 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1ab60 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
1ab70 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
1ab80 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
1ab90 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
1aba0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1abb0 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1abc0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
1abd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1abe0 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f  arse, "expressio
1abf0 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e  ns prohibited in
1ac00 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1ac10 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74     "UNIQUE const
1ac40 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
1ac50 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1ac60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1ac70 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64  }.      if( pInd
1ac80 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20  ex->aColExpr==0 
1ac90 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1aca0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c  x->aColExpr = pL
1acb0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  ist;.        pLi
1acc0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  st = 0;.      }.
1acd0 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50        j = XN_EXP
1ace0 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  R;.      pIndex-
1acf0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58  >aiColumn[i] = X
1ad00 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1ad10 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1ad20 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
1ad30 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78  {.      j = pCEx
1ad40 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
1ad50 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78     assert( j<=0x
1ad60 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66  7fff );.      if
1ad70 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( j<0 ){.       
1ad80 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79   j = pTab->iPKey
1ad90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1ada0 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ( pTab->aCol[j].
1adb0 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  notNull==0 ){.  
1adc0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1add0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1ade0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1adf0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1ae00 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d   = (i16)j;.    }
1ae10 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a  .    zColl = 0;.
1ae20 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
1ae30 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
1ae40 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1ae50 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20    int nColl;.   
1ae60 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74     zColl = pList
1ae70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a  Item->pExpr->u.z
1ae80 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f  Token;.      nCo
1ae90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
1aea0 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
1aeb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1aec0 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
1aed0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
1aee0 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
1aef0 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
1af00 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
1af10 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
1af20 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
1af30 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
1af40 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20  e if( j>=0 ){.  
1af50 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
1af60 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
1af70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1af80 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20  zColl ) zColl = 
1af90 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1afa0 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
1afb0 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
1afc0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1afd0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
1afe0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1aff0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1b010 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1b020 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
1b030 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
1b040 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
1b050 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
1b060 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
1b070 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1b080 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
1b090 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
1b0a0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74   /* Append the t
1b0b0 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20  able key to the 
1b0c0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1b0d0 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52  .  For WITHOUT R
1b0e0 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73  OWID.  ** tables
1b0f0 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74   (when pPk!=0) t
1b100 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1b110 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
1b120 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20   KEY.  For.  ** 
1b130 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77  normal tables (w
1b140 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73  hen pPk==0) this
1b150 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77   will be the row
1b160 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  id..  */.  if( p
1b170 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
1b180 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1b190 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1b1a0 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  nt x = pPk->aiCo
1b1b0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  lumn[j];.      a
1b1c0 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
1b1d0 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
1b1e0 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  mn(pIndex->aiCol
1b1f0 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  umn, pIndex->nKe
1b200 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20  yCol, x) ){.    
1b210 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c      pIndex->nCol
1b220 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65  umn--; .      }e
1b230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
1b240 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1b250 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
1b260 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1b270 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
1b280 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1b290 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1b2a0 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
1b2b0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
1b2c0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1b2d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
1b2e0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1b2f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b300 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b310 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  [i] = XN_ROWID;.
1b320 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1b330 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[i] = sqlite3S
1b340 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20  trBINARY;.  }.  
1b350 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1b360 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20  wEst(pIndex);.  
1b370 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
1b380 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d  Table==0 ) estim
1b390 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
1b3a0 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ndex);..  /* If 
1b3b0 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61  this index conta
1b3c0 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ins every column
1b3d0 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74   of its table, t
1b3e0 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74  hen mark.  ** it
1b3f0 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   as a covering i
1b400 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74  ndex */.  assert
1b410 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1b420 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d   .      || pTab-
1b430 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69  >iPKey<0 || sqli
1b440 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
1b450 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69  (pIndex, pTab->i
1b460 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65  PKey)>=0 );.  re
1b470 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f  computeColumnsNo
1b480 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 29  tIndexed(pIndex)
1b490 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  ;.  if( pTblName
1b4a0 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e  !=0 && pIndex->n
1b4b0 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43  Column>=pTab->nC
1b4c0 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  ol ){.    pIndex
1b4d0 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
1b4e0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1b4f0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1b500 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  ){.      if( j==
1b510 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f  pTab->iPKey ) co
1b520 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1b530 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  ( sqlite3ColumnO
1b540 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29  fIndex(pIndex,j)
1b550 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
1b560 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73        pIndex->is
1b570 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20  Covering = 0;.  
1b580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
1b5a0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1b5b0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1b5c0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1b5d0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1b5e0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1b5f0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1b600 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1b610 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1b620 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1b630 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1b640 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1b650 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1b660 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1b670 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1b680 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1b690 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1b6a0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1b6b0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1b6c0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1b6d0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1b6e0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1b6f0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1b700 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1b710 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1b720 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1b730 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1b740 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1b750 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1b760 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1b770 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1b780 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1b790 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1b7a0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1b7b0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1b7c0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1b7d0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1b7e0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1b7f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1b800 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1b810 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1b820 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1b830 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1b840 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1b850 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1b860 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1b870 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1b880 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1b890 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1b8a0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1b8b0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1b8c0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1b8d0 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1b8e0 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1b8f0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1b900 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1b910 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1b920 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1b930 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1b940 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1b950 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1b960 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1b970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1b980 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1b990 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1b9a0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1b9b0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1b9c0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1b9d0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1b9e0 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1b9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1ba00 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1ba10 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1ba20 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1ba30 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1ba40 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1ba50 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1ba60 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1ba70 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1ba80 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1ba90 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1baa0 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1bab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1bac0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1bad0 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1bae0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1baf0 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1bb00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1bb10 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1bb20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1bb30 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1bb40 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1bb50 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1bb60 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1bb70 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1bb80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1bb90 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1bba0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1bbb0 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1bbc0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1bbd0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1bbe0 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1bbf0 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1bc00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1bc10 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1bc20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1bc30 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1bc40 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1bc50 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1bc60 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1bc70 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1bc80 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1bc90 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1bca0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1bcb0 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1bcc0 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1bcd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1bce0 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1bcf0 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1bd00 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1bd10 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1bd20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1bd30 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1bd40 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1bd50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1bd60 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1bd70 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1bd80 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1bd90 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1bda0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1bdb0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1bdc0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1bdd0 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1bde0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1bdf0 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1be00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1be10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1be30 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1be40 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1be50 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1be60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1be70 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1be80 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1be90 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1bea0 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1beb0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1bec0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1bed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bee0 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51   if( idxType==SQ
1bef0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
1bf00 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e  MARYKEY ) pIdx->
1bf10 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1bf20 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e;.        goto 
1bf30 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1bf40 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
1bf50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f  .  }..  if( !IN_
1bf60 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1bf70 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
1bf80 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
1bf90 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
1bfa0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
1bfb0 68 65 72 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65  her.    ** in-me
1bfc0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
1bfd0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 20 20 2a  ructures. .    *
1bfe0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1bff0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1c000 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
1c010 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
1c020 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
1c030 61 73 73 65 72 74 28 20 21 49 4e 5f 53 50 45 43  assert( !IN_SPEC
1c040 49 41 4c 5f 50 41 52 53 45 20 29 3b 0a 20 20 20  IAL_PARSE );.   
1c050 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1c060 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1c070 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
1c080 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
1c090 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1c0a0 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
1c0b0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
1c0c0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  sh, .          p
1c0d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49  Index->zName, pI
1c0e0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28  ndex);.      if(
1c0f0 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73   p ){.        as
1c100 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
1c110 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
1c120 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1c130 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1c140 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
1c150 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1c160 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1c170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
1c180 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
1c190 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
1c1a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c  ;.      if( pTbl
1c1b0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1c1c0 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1c1d0 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
1c1e0 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  um;.      }.    
1c1f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1c200 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
1c210 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1c220 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
1c230 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
1c240 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20      ** index is 
1c250 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
1c260 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
1c270 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1c280 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
1c290 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1c2a0 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1c2b0 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1c2c0 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1c2d0 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20  n entry for.    
1c2e0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  ** the index in 
1c2f0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1c300 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75  r table and popu
1c310 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77  late the index w
1c320 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  ith.    ** conte
1c330 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1c340 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1c350 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1c360 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1c370 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ter.    ** table
1c380 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63   to parse the sc
1c390 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73  hema, or if this
1c3a0 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52   index is the PR
1c3b0 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a  IMARY KEY index.
1c3c0 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48      ** of a WITH
1c3d0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1c3e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1c3f0 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
1c400 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
1c410 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
1c420 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
1c430 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20  MARY KEY.    ** 
1c440 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
1c450 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1c460 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
1c470 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
1c480 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1c490 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1c4a0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1c4b0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1c4c0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
1c4d0 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
1c4e0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
1c4f0 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73      else if( Has
1c500 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70  Rowid(pTab) || p
1c510 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1c520 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
1c530 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
1c540 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
1c550 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1c560 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  ..      v = sqli
1c570 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1c580 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d  e);.      if( v=
1c590 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1c5a0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
1c5b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1c5c0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1c5d0 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1c5e0 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
1c5f0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
1c600 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  r the index usin
1c610 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42  g CreateIndex. B
1c620 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  ut before.      
1c630 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64  ** doing so, cod
1c640 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63  e a Noop instruc
1c650 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69  tion and store i
1c660 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20  ts address in . 
1c670 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e       ** Index.tn
1c680 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  um. This is requ
1c690 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69  ired in case thi
1c6a0 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61  s index is actua
1c6b0 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20  lly a .      ** 
1c6c0 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1c6d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74  the table is act
1c6e0 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20  ually a WITHOUT 
1c6f0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20  ROWID table. In 
1c700 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63  .      ** that c
1c710 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54  ase the convertT
1c720 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
1c730 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
1c740 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  l replace.      
1c750 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1c760 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1c770 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1c780 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1c790 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e  ow. */.      pIn
1c7a0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69  dex->tnum = sqli
1c7b0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1c7c0 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20   OP_Noop);.     
1c7d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c7e0 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42  p3(v, OP_CreateB
1c7f0 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c  tree, iDb, iMem,
1c800 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b   BTREE_BLOBKEY);
1c810 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65  ..      /* Gathe
1c820 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
1c830 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
1c840 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1c850 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  t into.      ** 
1c860 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1c870 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
1c880 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1c890 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
1c8a0 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c  (int)(pParse->sL
1c8b0 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61  astToken.z - pNa
1c8c0 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d  me->z) + pParse-
1c8d0 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20  >sLastToken.n;. 
1c8e0 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
1c8f0 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
1c900 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n--;.        /* 
1c910 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
1c920 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
1c930 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1c940 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  ement */.       
1c950 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1c960 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
1c970 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
1c980 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ",.            o
1c990 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1c9a0 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1c9b0 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1c9c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c9d0 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
1c9e0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
1c9f0 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
1ca00 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
1ca10 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1ca20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
1ca30 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
1ca40 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  ); */.        zS
1ca50 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
1ca60 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61  ..      /* Add a
1ca70 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
1ca80 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
1ca90 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f  s index.      */
1caa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
1cab0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1cac0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  , .          "IN
1cad0 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
1cae0 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
1caf0 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
1cb00 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
1cb10 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
1cb20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
1cb30 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1cb40 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
1cb50 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
1cb60 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
1cb70 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1cb80 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1cb90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cba0 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
1cbb0 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
1cbc0 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
1cbd0 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
1cbe0 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
1cbf0 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a  _Expire.      **
1cc00 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
1cc10 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
1cc20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
1cc30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1cc40 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1cc50 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1cc60 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1cc70 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1cc80 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1cc90 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1cca0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
1ccb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1ccc0 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
1ccd0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  b,.            s
1cce0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1ccf0 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
1cd00 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
1cd10 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
1cd20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cd30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1cd40 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b 0a  _Expire, 0, 1);.
1cd50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
1cd60 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1cd70 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  re(v, pIndex->tn
1cd80 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  um);.    }.  }..
1cd90 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
1cda0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
1cdb0 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
1cdc0 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
1cdd0 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
1cde0 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
1cdf0 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
1ce00 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
1ce10 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
1ce20 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
1ce30 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
1ce40 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73  the correct cons
1ce50 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a  traint check.  *
1ce60 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e  * processing (in
1ce70 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
1ce80 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
1ce90 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20  ()) as part of. 
1cea0 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49   ** UPDATE and I
1ceb0 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
1cec0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  .  .  */.  if( d
1ced0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
1cee0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
1cef0 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
1cf00 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
1cf10 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
1cf20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
1cf30 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1cf40 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
1cf50 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1cf60 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
1cf70 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
1cf80 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
1cf90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cfa0 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
1cfb0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1cfc0 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
1cfd0 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
1cfe0 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
1cff0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
1d000 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
1d010 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1d020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d030 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1d040 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1d050 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
1d060 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
1d070 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20   }.    pIndex = 
1d080 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  0;.  }.  else if
1d090 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1d0a0 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CT ){.    assert
1d0b0 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e  ( pParse->pNewIn
1d0c0 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  dex==0 );.    pP
1d0d0 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20  arse->pNewIndex 
1d0e0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49  = pIndex;.    pI
1d0f0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
1d100 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
1d110 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
1d120 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1d130 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
1d140 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
1d150 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1d160 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1d170 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1d180 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1d190 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1d1a0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1d1b0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1d1c0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1d1d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d1e0 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zName);.}../*.**
1d1f0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1d200 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1d210 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1d220 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1d230 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1d240 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1d250 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1d260 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1d270 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1d280 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1d290 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1d2a0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1d2b0 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1d2c0 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1d2d0 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1d2e0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1d2f0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1d300 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1d310 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1d320 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1d330 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1d340 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1d350 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1d360 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1d370 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1d380 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1d390 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1d3a0 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1d3b0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1d3c0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1d3d0 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1d3e0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1d3f0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1d400 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1d410 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1d420 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1d430 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1d440 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1d450 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1d460 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1d470 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1d480 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1d490 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1d4a0 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1d4b0 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1d4c0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1d4d0 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1d4e0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1d4f0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1d500 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1d510 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1d520 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1d530 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1d540 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1d550 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1d560 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1d570 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1d580 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1d590 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1d5a0 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1d5b0 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1d5c0 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1d5d0 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1d5e0 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1d5f0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1d600 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e   int i;..  /* In
1d610 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61 75  dexes with defau
1d620 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73  lt row estimates
1d630 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1d640 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20   stat1 data */. 
1d650 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e   assert( !pIdx->
1d660 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f  hasStat1 );..  /
1d670 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1d680 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66  entry (number of
1d690 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
1d6a0 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d  ex) to the estim
1d6b0 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  ated .  ** numbe
1d6c0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1d6d0 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20   table, or half 
1d6e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1d6f0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  ws in the table.
1d700 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69    ** for a parti
1d710 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20  al index.   But 
1d720 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65  do not let the e
1d730 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c  stimate drop bel
1d740 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d  ow 10. */.  a[0]
1d750 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1d760 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  >nRowLogEst;.  i
1d770 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
1d780 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d  xWhere!=0 ) a[0]
1d790 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28   -= 10;  assert(
1d7a0 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
1d7b0 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61  st(2) );.  if( a
1d7c0 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20  [0]<33 ) a[0] = 
1d7d0 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  33;             
1d7e0 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d       assert( 33=
1d7f0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1d800 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69  0) );..  /* Esti
1d810 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69  mate that a[1] i
1d820 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c  s 10, a[2] is 9,
1d830 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d   a[3] is 8, a[4]
1d840 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20   is 7, a[5] is. 
1d850 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73   ** 6 and each s
1d860 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20  ubsequent value 
1d870 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20  (if any) is 5.  
1d880 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31  */.  memcpy(&a[1
1d890 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73  ], aVal, nCopy*s
1d8a0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a  izeof(LogEst));.
1d8b0 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b    for(i=nCopy+1;
1d8c0 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i<=pIdx->nKeyCo
1d8d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  l; i++){.    a[i
1d8e0 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20  ] = 23;         
1d8f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1d900 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 23==sqlite3Lo
1d910 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a  gEst(5) );.  }..
1d920 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
1d930 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
1d940 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
1d950 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70  ndex(pIdx) ) a[p
1d960 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20  Idx->nKeyCol] = 
1d970 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1d980 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
1d990 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
1d9a0 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
1d9b0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
1d9c0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
1d9d0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1d9e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d9f0 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
1da00 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1da10 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
1da20 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
1da30 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
1da40 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
1da50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1da60 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
1da70 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1da80 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
1da90 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1daa0 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
1dab0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1dac0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1dad0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1dae0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1daf0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
1db00 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
1db10 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1db20 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1db30 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1db40 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1db50 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1db60 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1db70 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
1db80 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
1db90 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
1dba0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
1dbb0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
1dbc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dbd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1dbe0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1dbf0 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
1dc00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dc10 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1dc20 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1dc30 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
1dc40 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1dc50 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1dc60 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1dc70 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
1dc80 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1dc90 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
1dca0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1dcb0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b  DXTYPE_APPDEF ){
1dcc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1dcd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
1dce0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1dcf0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
1dd00 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
1dd10 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
1dd20 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
1dd30 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
1dd40 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1dd50 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1dd60 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1dd70 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
1dd80 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
1dd90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1dda0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1ddb0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1ddc0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
1ddd0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1dde0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
1ddf0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1de00 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1de10 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
1de20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1de30 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
1de40 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
1de50 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1de60 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1de70 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
1de80 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1de90 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1dea0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1deb0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1dec0 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20  && iDb ) code = 
1ded0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
1dee0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1def0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1df00 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
1df10 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
1df20 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
1df30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1df40 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1df50 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1df60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1df70 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
1df80 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
1df90 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
1dfa0 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
1dfb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1dfc0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1dfd0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1dfe0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1dff0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
1e000 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1e010 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
1e020 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
1e030 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
1e040 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69  e=%Q AND type='i
1e050 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64  ndex'",.       d
1e060 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
1e070 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
1e080 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  E, pIndex->zName
1e090 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1e0a0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
1e0b0 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
1e0c0 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  "idx", pIndex->z
1e0d0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1e0e0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1e0f0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1e100 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
1e110 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
1e120 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
1e130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e140 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
1e150 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
1e160 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
1e170 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
1e180 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
1e190 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1e1a0 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
1e1b0 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
1e1c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
1e1d0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1e1e0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
1e1f0 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
1e200 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
1e210 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69  size. This routi
1e220 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44  ne uses sqlite3D
1e230 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f  bRealloc().** to
1e240 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61   extend the arra
1e250 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
1e260 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  is space for a n
1e270 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ew object at the
1e280 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   end..**.** When
1e290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1e2a0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74  s called, *pnEnt
1e2b0 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ry contains the 
1e2c0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1e2d0 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e  ** the array (in
1e2e0 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68   entries - so th
1e2f0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
1e300 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a  ((*pnEntry) * sz
1e310 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20  Entry) bytes.** 
1e320 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a  in total)..**.**
1e330 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   If the realloc(
1e340 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  ) is successful 
1e350 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20  (i.e. if no OOM 
1e360 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
1e370 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ), the.** space 
1e380 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1e390 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
1e3a0 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79  zeroed, *pnEntry
1e3b0 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72   updated to.** r
1e3c0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1e3d0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
1e3e0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
1e3f0 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  o the new alloca
1e400 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64  tion.** returned
1e410 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  . *pIdx is set t
1e420 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1e430 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74  he new array ent
1e440 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
1e450 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1e460 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  , if the realloc
1e470 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20  () fails, *pIdx 
1e480 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70  is set to -1, *p
1e490 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a  nEntry remains.*
1e4a0 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
1e4b0 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79  a copy of pArray
1e4c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f   returned..*/.vo
1e4d0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
1e4e0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
1e4f0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
1e500 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
1e510 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
1e520 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
1e530 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
1e540 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
1e550 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
1e560 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
1e570 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
1e580 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
1e590 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
1e5a0 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
1e5b0 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
1e5c0 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
1e5d0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
1e5e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
1e5f0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
1e600 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
1e610 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
1e620 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
1e630 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e  .  int n = *pnEn
1e640 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
1e650 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
1e660 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29   int sz = (n==0)
1e670 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20   ? 1 : 2*n;.    
1e680 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c  void *pNew = sql
1e690 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1e6a0 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45  , pArray, sz*szE
1e6b0 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  ntry);.    if( p
1e6c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e6d0 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20  *pIdx = -1;.    
1e6e0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1e6f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61  .    }.    pArra
1e700 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
1e710 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
1e720 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e  y;.  memset(&z[n
1e730 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
1e740 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
1e750 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  x = n;.  ++*pnEn
1e760 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
1e770 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
1e780 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
1e790 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
1e7a0 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
1e7b0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
1e7c0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
1e7d0 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
1e7e0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1e7f0 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
1e800 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
1e810 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1e820 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50  Append(Parse *pP
1e830 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c  arse, IdList *pL
1e840 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
1e850 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  en){.  sqlite3 *
1e860 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e870 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1e880 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1e890 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1e8a0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1e8b0 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
1e8c0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1e8d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e8e0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
1e8f0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1e900 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
1e910 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
1e920 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
1e930 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
1e940 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
1e950 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
1e960 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
1e970 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1e980 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1e990 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1e9a0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1e9b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1e9c0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1e9d0 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f  oken);.  if( IN_
1e9e0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26  RENAME_OBJECT &&
1e9f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1ea00 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
1ea10 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
1ea20 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70  pParse, (void*)p
1ea30 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1ea40 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20  , pToken);.  }. 
1ea50 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1ea60 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
1ea70 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  n IdList..*/.voi
1ea80 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  d sqlite3IdListD
1ea90 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1eaa0 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
1eab0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1eac0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1ead0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1eae0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1eaf0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1eb00 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1eb10 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
1eb20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1eb30 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b  e(db, pList->a);
1eb40 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1eb50 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
1eb60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1eb70 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1eb80 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1eb90 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1eba0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1ebb0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1ebc0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1ebd0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1ebe0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1ebf0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1ec00 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1ec10 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1ec20 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ec30 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1ec40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1ec50 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1ec60 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1ec70 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1ec80 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1ec90 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1eca0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1ecb0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1ecc0 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1ecd0 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1ece0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1ecf0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1ed00 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1ed10 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1ed20 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1ed30 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1ed40 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1ed50 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1ed60 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1ed70 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1ed80 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1ed90 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1eda0 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1edb0 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1edc0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1edd0 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1ede0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1edf0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1ee00 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1ee10 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1ee20 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1ee30 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1ee40 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1ee50 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1ee60 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1ee70 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1ee80 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1ee90 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1eea0 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1eeb0 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1eec0 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1eed0 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1eee0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1eef0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1ef00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1ef10 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1ef20 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1ef30 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1ef40 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1ef50 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1ef60 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1ef70 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1ef80 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1ef90 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1efa0 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1efb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1efc0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1efd0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1efe0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1eff0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1f000 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1f010 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1f020 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f030 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1f040 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1f050 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1f060 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1f070 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1f080 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1f090 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1f0a0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1f0b0 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1f0c0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1f0d0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1f0e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f0f0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1f100 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1f110 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1f120 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1f130 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1f140 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1f150 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1f160 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1f170 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1f180 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1f190 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1f1a0 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1f1b0 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78  pSrc->nSrc*2+nEx
1f1c0 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1f1d0 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
1f1e0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1f1f0 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
1f200 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1f210 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
1f220 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
1f230 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
1f240 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1f250 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1f260 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1f270 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
1f280 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
1f290 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
1f2a0 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
1f2b0 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
1f2c0 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
1f2d0 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
1f2e0 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
1f2f0 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74  c->nAlloc = nGot
1f300 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1f310 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1f320 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1f330 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1f340 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1f350 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1f360 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1f370 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1f380 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1f390 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1f3a0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1f3b0 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
1f3c0 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1f3d0 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1f3e0 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1f3f0 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1f400 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1f410 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1f420 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1f430 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1f440 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1f450 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1f460 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1f470 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1f480 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1f490 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1f4a0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1f4b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1f4c0 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1f4d0 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1f4e0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1f4f0 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1f500 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1f510 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1f520 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1f530 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1f540 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1f550 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1f560 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1f570 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1f580 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1f590 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1f5a0 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1f5b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1f5c0 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1f5d0 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1f5e0 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1f5f0 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1f600 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1f610 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1f620 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1f630 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1f640 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1f650 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1f660 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1f670 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1f680 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1f690 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1f6a0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1f6b0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1f6c0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1f6d0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1f6e0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1f6f0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1f700 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1f710 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1f720 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1f730 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1f740 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1f750 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1f760 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1f770 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1f780 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1f790 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1f7a0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1f7b0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1f7c0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1f7d0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1f7e0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1f7f0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1f800 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1f810 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1f820 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1f830 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1f840 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1f850 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1f860 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1f870 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1f880 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1f890 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1f8a0 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1f8b0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1f8c0 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1f8d0 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1f8e0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1f8f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1f900 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1f910 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1f920 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1f930 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1f940 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1f950 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1f960 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1f970 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1f980 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1f990 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1f9a0 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1f9b0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1f9c0 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1f9d0 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1f9e0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1f9f0 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1fa00 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1fa10 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1fa20 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1fa30 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1fa40 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1fa50 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1fa60 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1fa70 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1fa80 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1fa90 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1faa0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1fab0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1fac0 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1fad0 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1fae0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1faf0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1fb00 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1fb10 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1fb20 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1fb30 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1fb40 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1fb50 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1fb60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1fb70 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1fb80 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1fb90 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1fba0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1fbb0 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1fbc0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1fbd0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1fbe0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1fbf0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1fc00 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
1fc10 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1fc20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1fc30 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1fc40 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1fc50 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20      pList->nSrc 
1fc60 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
1fc70 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c  &pList->a[0], 0,
1fc80 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1fc90 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74  [0]));.    pList
1fca0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[0].iCursor =
1fcb0 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
1fcc0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1fcd0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1fce0 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1fcf0 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a  ist->nSrc);.  }.
1fd00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1fd10 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1fd20 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1fd30 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1fd40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1fd50 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1fd60 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1fd70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1fd80 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1fd90 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1fda0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1fdb0 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1fdc0 65 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  e ){.    pItem->
1fdd0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1fde0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1fdf0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20   pDatabase);.   
1fe00 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1fe10 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1fe20 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1fe30 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
1fe40 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
1fe50 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1fe60 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1fe70 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
1fe80 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1fe90 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
1fea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
1feb0 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64  n VdbeCursor ind
1fec0 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c  ex numbers to al
1fed0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
1fee0 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
1fef0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1ff00 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
1ff10 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1ff20 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1ff30 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
1ff40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1ff50 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
1ff60 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1ff70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1ff80 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
1ff90 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
1ffa0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
1ffb0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1ffc0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
1ffd0 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
1ffe0 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
1fff0 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
20000 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
20010 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
20020 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
20030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20040 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
20050 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74  sors(pParse, pIt
20060 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  em->pSelect->pSr
20070 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
20080 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
20090 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
200a0 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
200b0 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
200c0 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
200d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
200e0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
200f0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
20100 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
20110 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20120 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
20130 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
20140 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
20150 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
20160 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
20170 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
20180 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20190 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
201a0 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
201b0 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
201c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
201d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
201e0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
201f0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
20200 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
20210 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20220 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  , pItem->u1.zInd
20230 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28  exedBy);.    if(
20240 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
20250 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78  Func ) sqlite3Ex
20260 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
20270 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
20280 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
20290 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
202a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
202b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
202c0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
202d0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
202e0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
202f0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e  e(db, pItem->pOn
20300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
20310 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
20320 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
20330 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
20340 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  eeNN(db, pList);
20350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
20360 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
20370 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
20380 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
20390 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
203a0 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
203b0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
203c0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
203d0 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
203e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
203f0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
20400 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
20410 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
20420 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
20430 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
20440 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
20450 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
20460 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
20470 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
20480 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
20490 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
204a0 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
204b0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
204c0 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
204d0 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
204e0 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
204f0 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
20500 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
20510 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65  as an alias, the
20520 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
20530 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
20540 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
20550 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
20560 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
20570 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
20580 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
20590 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
205a0 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
205b0 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
205c0 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
205d0 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
205e0 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
205f0 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
20600 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
20610 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
20620 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
20630 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
20640 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
20650 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
20660 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
20670 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
20680 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
20690 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
206a0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
206b0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
206c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
206d0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
206e0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20700 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
20710 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20720 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
20730 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
20740 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
20750 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
20760 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
20770 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
20780 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
20790 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
207a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
207b0 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
207c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
207d0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
207e0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
207f0 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
20800 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
20810 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
20820 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
20830 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
20840 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
20850 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
20860 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
20870 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
20880 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
20890 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
208a0 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
208b0 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
208c0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
208d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
208e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
208f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20900 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
20910 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
20920 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
20930 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20940 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
20950 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
20960 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
20970 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
20980 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
20990 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
209a0 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
209b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
209c0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
209d0 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
209e0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
209f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
20a00 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
20a10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
20a20 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74  >nSrc>0 );.  pIt
20a30 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
20a40 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
20a50 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70   (pTable==0)==(p
20a60 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a  Database==0) );.
20a70 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
20a80 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61  >zName==0 || pDa
20a90 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20 20 69  tabase!=0 );.  i
20aa0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
20ab0 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ECT && pItem->zN
20ac0 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ame ){.    Token
20ad0 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41   *pToken = (ALWA
20ae0 59 53 28 70 44 61 74 61 62 61 73 65 29 20 26 26  YS(pDatabase) &&
20af0 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f   pDatabase->z) ?
20b00 20 70 44 61 74 61 62 61 73 65 20 3a 20 70 54 61   pDatabase : pTa
20b10 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
20b20 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
20b30 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e  Parse, pItem->zN
20b40 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  ame, pToken);.  
20b50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69  }.  assert( pAli
20b60 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  as!=0 );.  if( p
20b70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20  Alias->n ){.    
20b80 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  pItem->zAlias = 
20b90 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20ba0 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29  oken(db, pAlias)
20bb0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70  ;.  }.  pItem->p
20bc0 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65  Select = pSubque
20bd0 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e  ry;.  pItem->pOn
20be0 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d   = pOn;.  pItem-
20bf0 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67  >pUsing = pUsing
20c00 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20  ;.  return p;.. 
20c10 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
20c20 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  r:.  assert( p==
20c30 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
20c40 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e  prDelete(db, pOn
20c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
20c60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73  stDelete(db, pUs
20c70 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ing);.  sqlite3S
20c80 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
20c90 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65  pSubquery);.  re
20ca0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20cb0 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20   Add an INDEXED 
20cc0 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
20cd0 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  D clause to the 
20ce0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
20cf0 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  ded .** element 
20d00 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  of the source-li
20d10 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
20d20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20d30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20d40 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
20d50 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
20d60 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b   SrcList *p, Tok
20d70 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b  en *pIndexedBy){
20d80 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65  .  assert( pInde
20d90 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  xedBy!=0 );.  if
20da0 28 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42  ( p && pIndexedB
20db0 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74  y->n>0 ){.    st
20dc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20dd0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
20de0 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
20df0 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
20e00 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
20e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
20e20 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
20e30 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
20e40 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
20e50 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
20e60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20e70 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
20e80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
20e90 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
20ea0 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
20eb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
20ec0 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
20ed0 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
20ee0 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
20ef0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
20f00 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
20f10 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
20f20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
20f30 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
20f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f50 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
20f60 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e  xedBy = sqlite3N
20f70 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
20f80 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
20f90 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65  dBy);.      pIte
20fa0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
20fb0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 1;.    }.  }
20fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
20fd0 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
20fe0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
20ff0 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
21000 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
21010 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
21020 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21030 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
21040 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21050 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
21060 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
21070 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
21080 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21090 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
210a0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
210b0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
210c0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
210d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
210e0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
210f0 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
21100 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21110 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
21120 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
21130 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
21140 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
21150 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
21160 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
21170 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
21180 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
21190 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
211a0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
211b0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
211c0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
211d0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
211e0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
211f0 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
21200 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
21210 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
21220 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
21230 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
21240 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
21250 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
21260 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
21270 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
21280 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
21290 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
212a0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
212b0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
212c0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
212d0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
212e0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
212f0 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
21300 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
21310 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
21320 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
21330 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
21340 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
21350 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
21360 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
21370 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
21380 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
21390 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
213a0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
213b0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
213c0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
213d0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
213e0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
213f0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
21400 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
21410 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
21420 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
21430 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
21440 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
21450 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
21460 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
21470 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
21480 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
21490 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
214a0 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
214b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
214c0 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
214d0 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
214e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
214f0 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
21500 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21510 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
21520 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
21530 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
21540 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
21550 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
21560 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
21570 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
21580 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21590 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
215a0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
215b0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
215c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
215d0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
215e0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
215f0 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
21600 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
21610 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
21620 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
21630 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
21640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21650 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
21660 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
21670 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
21680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21690 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
216a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
216b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
216c0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
216d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
216e0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
216f0 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52  or a COMMIT or R
21700 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e  OLLBACK statemen
21710 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52  t..** Code for R
21720 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72  OLLBACK is gener
21730 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54  ated if eType==T
21740 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68  K_ROLLBACK.  Oth
21750 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69  erwise.** code i
21760 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  s generated for 
21770 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69  a COMMIT..*/.voi
21780 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e  d sqlite3EndTran
21790 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
217a0 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65  Parse, int eType
217b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
217c0 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a  int isRollback;.
217d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
217e0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
217f0 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
21800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
21810 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c  pe==TK_COMMIT ||
21820 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c   eType==TK_END |
21830 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  | eType==TK_ROLL
21840 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c  BACK );.  isRoll
21850 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b  back = eType==TK
21860 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28  _ROLLBACK;.  if(
21870 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
21880 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
21890 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20  _TRANSACTION, . 
218a0 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b        isRollback
218b0 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20   ? "ROLLBACK" : 
218c0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
218d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
218e0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
218f0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
21900 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
21910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21920 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
21930 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63  it, 1, isRollbac
21940 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
21950 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21960 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
21970 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
21980 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
21990 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
219a0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
219b0 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
219c0 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
219d0 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
219e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
219f0 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
21a00 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
21a10 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
21a20 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
21a30 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
21a40 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
21a50 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
21a60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
21a70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21a80 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
21a90 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
21aa0 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
21ab0 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
21ac0 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
21ad0 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
21ae0 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
21af0 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
21b00 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
21b10 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
21b20 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
21b30 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
21b40 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
21b50 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
21b60 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
21b70 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
21b80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21b90 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
21ba0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
21bb0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
21bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21bd0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
21be0 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
21bf0 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
21c00 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
21c10 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
21c20 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
21c30 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
21c40 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
21c50 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
21c60 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
21c70 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
21c80 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
21c90 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
21ca0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
21cb0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
21cc0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
21cd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
21ce0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
21cf0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
21d00 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
21d10 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
21d20 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
21d30 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
21d40 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
21d50 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
21d60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21d70 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
21d80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
21d90 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
21da0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
21db0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
21dc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
21dd0 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
21de0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21df0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
21e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21e10 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
21e20 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
21e30 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
21e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
21e60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21e70 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
21e80 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
21e90 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
21ea0 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
21eb0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
21ec0 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
21ed0 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
21ee0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21ef0 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
21f00 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
21f10 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
21f20 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
21f30 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
21f40 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
21f50 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
21f60 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
21f70 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
21f80 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
21f90 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
21fa0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
21fb0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21fc0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
21fd0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
21fe0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69  schema cookie wi
21ff0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65  ll need to be ve
22000 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61  rified.** for da
22010 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65  tabase iDb.  The
22020 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c   code to actuall
22030 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  y verify the sch
22040 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69  ema cookie.** wi
22050 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ll occur at the 
22060 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  end of the top-l
22070 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69  evel VDBE and wi
22080 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  ll be generated.
22090 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c  ** later, by sql
220a0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
220b0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
220c0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
220d0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
220e0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
220f0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
22100 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
22110 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
22120 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
22130 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
22140 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
22150 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
22160 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
22170 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
22180 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
22190 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
221a0 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
221b0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
221c0 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64  exHeld(pParse->d
221d0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
221e0 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
221f0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
22200 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
22210 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
22220 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
22230 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
22240 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
22250 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
22260 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
22270 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
22280 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
22290 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
222a0 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
222b0 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
222c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
222d0 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
222e0 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
222f0 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
22300 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
22310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
22320 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
22330 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
22340 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
22350 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
22360 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
22370 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
22380 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22390 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
223a0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
223b0 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
223c0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
223d0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
223e0 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
223f0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22400 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  Db, pDb->zDbSNam
22410 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
22420 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
22430 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
22440 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
22450 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
22460 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
22470 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
22480 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
22490 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
224a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
224b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
224c0 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
224d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
224e0 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
224f0 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
22500 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
22510 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
22520 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
22530 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
22540 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
22550 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
22560 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
22570 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
22580 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
22590 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
225a0 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
225b0 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
225c0 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
225d0 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
225e0 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
225f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
22600 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
22610 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
22620 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
22630 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
22640 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
22650 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
22660 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
22670 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
22680 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
22690 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
226a0 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
226b0 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
226c0 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
226d0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
226e0 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
226f0 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
22700 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
22710 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
22720 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
22730 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
22740 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
22750 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
22760 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
22770 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
22780 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
22790 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
227a0 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
227b0 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
227c0 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
227d0 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
227e0 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
227f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
22800 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
22810 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
22820 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
22830 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
22840 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
22850 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
22860 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
22870 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
22880 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
22890 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
228a0 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
228b0 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
228c0 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
228d0 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
228e0 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
228f0 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
22900 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
22910 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
22920 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
22930 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
22940 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
22950 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
22960 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
22970 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
22980 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
22990 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
229a0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
229b0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
229c0 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
229d0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
229e0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
229f0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
22a00 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
22a10 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
22a20 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
22a30 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
22a40 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
22a50 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
22a60 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
22a70 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
22a80 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
22a90 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
22aa0 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
22ab0 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
22ac0 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
22ad0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
22ae0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22af0 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
22b00 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
22b10 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
22b20 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
22b30 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
22b40 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
22b50 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
22b60 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
22b70 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
22b80 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
22b90 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
22ba0 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
22bb0 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
22bc0 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
22bd0 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
22be0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
22bf0 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
22c00 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
22c10 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
22c20 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
22c30 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
22c40 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
22c50 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
22c60 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
22c70 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
22c80 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
22c90 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
22ca0 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
22cb0 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
22cc0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
22cd0 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
22ce0 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
22cf0 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
22d00 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
22d10 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
22d20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
22d30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22d40 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
22d50 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
22d60 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
22d70 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
22d80 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
22d90 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
22da0 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
22db0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
22dc0 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
22dd0 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
22de0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
22df0 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
22e00 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
22e10 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
22e20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
22e30 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
22e40 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
22e50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
22e60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
22e70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
22e80 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
22e90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22ea0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22eb0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
22ec0 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
22ed0 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
22ee0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
22ef0 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
22f00 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
22f10 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
22f20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
22f30 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
22f40 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
22f50 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
22f60 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
22f70 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
22f80 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
22f90 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
22fa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
22fb0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
22fc0 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
22fd0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
22fe0 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
22ff0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
23000 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23010 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
23020 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
23030 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
23040 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
23050 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
23060 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  4type);.  sqlite
23070 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
23080 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
23090 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
230a0 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
230b0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
230c0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
230d0 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
230e0 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
230f0 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
23100 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23110 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23120 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
23130 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
23140 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
23150 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
23160 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
23170 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
23180 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
23190 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
231a0 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
231b0 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
231c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
231d0 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
231e0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
231f0 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
23200 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
23210 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f  .  if( pIdx->aCo
23220 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  lExpr ){.    sql
23230 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
23240 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  (&errMsg, "index
23250 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e   '%q'", pIdx->zN
23260 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
23270 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
23280 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
23290 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
232a0 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Col;.      asser
232b0 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
232c0 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[j]>=0 );.     
232d0 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
232e0 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
232f0 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
23300 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
23310 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65  e3_str_append(&e
23320 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
23330 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
23340 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72  tr_appendall(&er
23350 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  rMsg, pTab->zNam
23360 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
23370 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
23380 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20  rMsg, ".", 1);. 
23390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
233a0 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d  _appendall(&errM
233b0 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  sg, zCol);.    }
233c0 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
233d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
233e0 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
233f0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
23400 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
23410 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
23420 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
23430 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
23440 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
23450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23460 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
23470 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
23480 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
23490 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
234a0 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
234b0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
234c0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
234d0 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
234e0 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
234f0 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
23500 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
23510 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
23520 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23530 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
23540 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
23550 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
23560 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
23570 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
23580 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
23590 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
235a0 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
235b0 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
235c0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
235d0 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
235e0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
235f0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
23600 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
23610 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
23640 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
23650 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
23660 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
23670 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
23680 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
23690 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
236a0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
236b0 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
236c0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
236d0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
236e0 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
236f0 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
23700 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
23710 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
23720 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
23750 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
23760 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23770 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
23780 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23790 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
237a0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
237b0 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
237c0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
237d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
237e0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
237f0 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
23800 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
23810 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
23820 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
23830 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
23840 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
23850 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
23860 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
23870 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23880 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
23890 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
238a0 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
238b0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
238c0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
238d0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
238e0 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
238f0 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
23900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
23910 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
23920 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
23930 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
23940 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
23950 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
23960 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
23970 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
23980 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
23990 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
239a0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
239b0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
239c0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
239d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
239e0 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
239f0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
23a00 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
23a10 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
23a20 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
23a30 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
23a40 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
23a50 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
23a60 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
23a70 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
23a80 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
23a90 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
23aa0 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
23ab0 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
23ac0 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
23ad0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
23ae0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
23af0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
23b00 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
23b10 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
23b20 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
23b30 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
23b40 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
23b50 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
23b60 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
23b70 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
23b80 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
23b90 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
23ba0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
23bb0 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
23bc0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
23bd0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
23be0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
23bf0 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
23c00 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
23c10 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
23c20 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
23c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23c40 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
23c50 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
23c60 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
23c70 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
23c80 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
23c90 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
23ca0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
23cb0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
23cc0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ce0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
23cf0 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
23d00 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
23d10 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
23d20 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
23d30 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
23d40 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
23d50 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
23d60 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
23d70 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
23d80 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
23d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
23da0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
23db0 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
23dc0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
23dd0 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
23de0 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
23df0 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
23e00 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
23e10 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
23e20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
23e30 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
23e40 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
23e50 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
23e60 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
23e70 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
23e80 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
23e90 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
23ea0 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
23eb0 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
23ec0 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
23ed0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
23ee0 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
23ef0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
23f00 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
23f10 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
23f20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
23f30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
23f40 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
23f70 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
23f80 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
23f90 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
23fa0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
23fb0 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
23fc0 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
23fd0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
23fe0 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
23ff0 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
24000 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
24010 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
24020 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
24030 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
24040 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
24050 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
24060 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
24070 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
24080 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
24090 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
240a0 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
240b0 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
240c0 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
240d0 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
240e0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
240f0 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
24100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24110 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
24120 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
24130 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
24140 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
24150 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
24160 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
24170 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
24180 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
24190 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
241a0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
241b0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
241c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
241d0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
241e0 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
241f0 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
24200 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24210 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
24220 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24240 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
24250 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
24260 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
24270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
24280 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
24290 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
242a0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
242b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
242c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
242d0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
242e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
242f0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
24300 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24310 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
24320 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
24330 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
24340 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
24350 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
24360 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
24370 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
24380 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
24390 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
243a0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
243b0 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
243c0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
243d0 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
243e0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
243f0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
24400 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
24410 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
24420 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
24430 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
24440 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
24450 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
24460 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
24470 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
24480 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
24490 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
244a0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
244b0 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
244c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
244d0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
244e0 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
244f0 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
24500 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
24510 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
24520 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
24530 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
24540 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
24550 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
24560 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
24570 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
24580 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
24590 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
245a0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
245b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
245c0 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
245d0 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
245e0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
245f0 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
24600 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
24610 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
24620 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
24630 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
24640 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
24650 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
24660 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
24670 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
24680 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
24690 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
246a0 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
246b0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
246c0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
246d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
246e0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
246f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
24700 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
24710 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
24720 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
24730 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
24740 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
24750 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
24760 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
24770 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
24780 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
24790 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
247a0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
247b0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
247c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
247d0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
247e0 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
247f0 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
24800 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
24810 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
24820 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
24830 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72  ure that is appr
24840 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
24850 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a  given Index..**.
24860 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
24870 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
24880 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
24890 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
248a0 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
248b0 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
248c0 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
248d0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
248e0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
248f0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
24900 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
24910 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
24920 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
24930 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
24940 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
24950 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
24960 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
24970 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
24980 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
24990 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
249a0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
249b0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
249c0 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
249d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
249e0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
249f0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
24a00 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
24a10 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
24a20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
24a30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
24a40 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
24a50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
24a60 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
24a70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24a80 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
24a90 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b  oll[i];.      pK
24aa0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  ey->aColl[i] = z
24ab0 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  Coll==sqlite3Str
24ac0 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20  BINARY ? 0 :.   
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
24af0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
24b00 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
24b10 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
24b20 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
24b30 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
24b40 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
24b50 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61  >nErr ){.      a
24b60 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
24b70 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  c==SQLITE_ERROR_
24b80 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20  MISSING_COLLSEQ 
24b90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
24ba0 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29  x->bNoQuery==0 )
24bb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61  {.        /* Dea
24bc0 63 74 69 76 61 74 65 20 74 68 65 20 69 6e 64 65  ctivate the inde
24bd0 78 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  x because it con
24be0 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e  tains an unknown
24bf0 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20   collating.     
24c00 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20     ** sequence. 
24c10 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   The only way to
24c20 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e   reactive the in
24c30 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64  dex is to reload
24c40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24c50 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20  schema.  Adding 
24c60 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c  the missing coll
24c70 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c  ating sequence l
24c80 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ater does not.  
24c90 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76        ** reactiv
24ca0 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68  e the index.  Th
24cb0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61  e application ha
24cc0 64 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  d the chance to 
24cd0 72 65 67 69 73 74 65 72 0a 20 20 20 20 20 20 20  register.       
24ce0 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20   ** the missing 
24cf0 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20  index using the 
24d00 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64  collation-needed
24d10 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a   callback.  For.
24d20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c          ** simpl
24d30 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69  icity, SQLite wi
24d40 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20  ll not give the 
24d50 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65  application a se
24d60 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20  cond chance..   
24d70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24d80 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d  pIdx->bNoQuery =
24d90 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
24da0 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
24db0 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20  ERROR_RETRY;.   
24dc0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24dd0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
24de0 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
24df0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
24e00 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
24e10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24e20 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
24e30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24e40 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
24e50 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
24e60 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
24e70 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
24e80 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
24e90 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
24ea0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
24eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24ec0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24ed0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
24ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
24ef0 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
24f00 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
24f10 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
24f20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
24f30 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
24f40 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
24f50 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
24f60 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
24f70 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
24f80 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
24f90 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
24fa0 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
24fb0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
24fc0 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
24fd0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24fe0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
24ff0 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
25000 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
25010 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25020 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
25030 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
25040 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
25050 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
25060 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
25070 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
25080 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
25090 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
250a0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
250b0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
250c0 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
250d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
250e0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
250f0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
25100 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
25110 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
25120 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
25130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
25140 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25150 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
25160 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
25170 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
25180 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25190 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
251a0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
251b0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
251c0 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
251d0 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
251e0 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
251f0 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
25200 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
25210 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
25220 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
25230 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25240 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
25250 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
25260 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
25270 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
25280 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
25290 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
252a0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
252b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
252c0 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
252d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
252e0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
252f0 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
25300 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
25310 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
25320 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
25330 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25340 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
25350 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
25360 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25370 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
25380 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
25390 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
253a0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
253b0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
253c0 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
253d0 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
253e0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
253f0 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
25400 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
25410 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
25420 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
25430 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25440 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
25450 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
25460 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
25470 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
25480 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
25490 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
254a0 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
254b0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
254c0 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
254d0 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
254e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
254f0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
25500 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
25510 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
25520 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
25530 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
25540 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25550 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
25560 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
25570 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
25580 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
25590 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
255a0 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.