/ Hex Artifact Content
Login

Artifact eb0ab28d8e7ab0e567d67a86208abd2409f8a378a1333e209a72fde95c407d37:


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 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
2120: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
2130: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
2140: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2150: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2160: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2170: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2180: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2190: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
21a0: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
21b0: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
21c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2200: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2220: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2230: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2240: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2250: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2260: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2270: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2280: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2290: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22a0: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
22b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
22c0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
22d0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
22e0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
22f0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
2300: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
2310: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2320: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2330: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2350: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2360: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2370: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2380: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2390: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
23a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
23b0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
23c0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
23d0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
23e0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
23f0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2400: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2410: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2420: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2430: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2440: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2450: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2460: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2470: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2480: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2490: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
24a0: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
24b0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
24c0: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
24d0: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
24e0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
24f0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2500: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2510: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2520: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2530: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2540: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2550: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2560: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2570: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2580: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2590: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
25a0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
25b0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
25c0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
25d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
25e0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
25f0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
2600: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
2610: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2620: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2630: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2640: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2660: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2670: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2680: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2690: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
26a0: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
26b0: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
26c0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
26d0: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
26e0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
26f0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
2700: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
2710: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2720: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2750: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2760: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2770: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2780: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2790: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
27a0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
27b0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
27c0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
27d0: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
27e0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
27f0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
2800: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
2810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2820: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
2830: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
2840: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71  ;.        p = sq
2850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2860: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2870: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
2880: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2890: 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20  p ) return p;.  
28a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28b0: 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49  /* Not found.  I
28c0: 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65  f the name we we
28d0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77  re looking for w
28e0: 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d  as temp.sqlite_m
28f0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  aster.    ** the
2900: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d  n change the nam
2910: 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70  e to sqlite_temp
2920: 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20  _master and try 
2930: 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
2940: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2950: 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  (zName, MASTER_N
2960: 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  AME)!=0 ) break;
2970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2980: 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61  _stricmp(zDataba
2990: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  se, db->aDb[1].z
29a0: 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72  DbSName)!=0 ) br
29b0: 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  eak;.    zName =
29c0: 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d   TEMP_MASTER_NAM
29d0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
29e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  0;.}../*.** Loca
29f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a10: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a20: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a30: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a50: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a60: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2a70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2a80: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2a90: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2aa0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ab0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2ac0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2ad0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2ae0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2af0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b00: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b10: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b20: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b30: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b40: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b50: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b60: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2b70: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2b80: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2b90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2ba0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2bb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2bd0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2be0: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2bf0: 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20  .  u32 flags,   
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43            /* LOC
2c10: 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41  ATE_VIEW or LOCA
2c20: 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f  TE_NOERR */.  co
2c30: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2c40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c50: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2c60: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c80: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
2c90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ca0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
2cb0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
2cc0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2cd0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2ce0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2cf0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2d00: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d10: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2d20: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2d30: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2d40: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2d50: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  L. */.  if( (db-
2d60: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
2d70: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
2d80: 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49  )==0 .   && SQLI
2d90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2da0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2db0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2dc0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2de0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2df0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2e00: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2e10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e20: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
2e30: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
2e40: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
2e50: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
2e60: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
2e70: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
2e80: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
2e90: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
2ea0: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
2eb0: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
2ec0: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2ed0: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2ee0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
2ef0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74  Parse->disableVt
2f00: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ab==0 ){.      M
2f10: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
2f20: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
2f30: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
2f40: 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ule, zName);.   
2f50: 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26     if( pMod==0 &
2f60: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
2f70: 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
2f80: 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  a_", 7)==0 ){.  
2f90: 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c        pMod = sql
2fa0: 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65  ite3PragmaVtabRe
2fb0: 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65  gister(db, zName
2fc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2fd0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
2fe0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
2ff0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
3000: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
3010: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3020: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3030: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3040: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c     if( flags & L
3050: 4f 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65  OCATE_NOERR ) re
3060: 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72  turn 0;.    pPar
3070: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
3080: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
3090: 20 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26   IsVirtual(p) &&
30a0: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
30b0: 56 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20  Vtab ){.    p = 
30c0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d  0;.  }..  if( p=
30d0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
30e0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61  char *zMsg = fla
30f0: 67 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57  gs & LOCATE_VIEW
3100: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
3110: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
3120: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
3130: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
3140: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3150: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
3160: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
3170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
3180: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3190: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
31a0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
31b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
31c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
31d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
31e0: 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
31f0: 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a  fied by *p..**.*
3200: 2a 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70  * This is a wrap
3210: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
3220: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
3230: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
3240: 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74  between.** sqlit
3250: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20  e3LocateTable() 
3260: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
3270: 6e 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  n is that this f
3280: 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74  unction restrict
3290: 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20  s.** the search 
32a0: 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53  to schema (p->pS
32b0: 63 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20  chema) if it is 
32c0: 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63  not NULL. p->pSc
32d0: 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e  hema may be.** n
32e0: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  on-NULL if it is
32f0: 20 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20   part of a view 
3300: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
3310: 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53  am definition. S
3320: 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78  ee.** sqlite3Fix
3330: 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65  SrcList() for de
3340: 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20  tails..*/.Table 
3350: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
3360: 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65  bleItem(.  Parse
3370: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32   *pParse, .  u32
3380: 20 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74   flags,.  struct
3390: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
33b0: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
33c0: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
33d0: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
33e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
33f0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
3400: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
3410: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
3420: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
3430: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
3440: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
3450: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
3460: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
3470: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20   p->zDatabase;. 
3480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3490: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
34a0: 50 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d  Parse, flags, p-
34b0: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a  >zName, zDb);.}.
34c0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
34d0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
34e0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
34f0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
3500: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
3510: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3520: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
3530: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3540: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
3550: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3560: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3570: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
3580: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
3590: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
35a0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
35b0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
35c0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
35d0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
35e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
35f0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
3600: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
3610: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
3620: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
3630: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
3640: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
3650: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
3660: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
3670: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
3680: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
3690: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
36a0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
36b0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
36c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
36d0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
36e0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
36f0: 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c   int i;.  /* All
3700: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
3710: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
3720: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
3730: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
3740: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
3750: 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Db!=0 || sqlite3
3760: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
3770: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f  exes(db) );.  fo
3780: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
3790: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
37a0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
37b0: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
37c0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
37d0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
37e0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
37f0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  a = db->aDb[j].p
3800: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
3810: 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20  rt( pSchema );. 
3820: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
3830: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
3840: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
3850: 53 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  SName) ) continu
3860: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
3870: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3880: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
3890: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
38a0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
38b0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
38c0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
38d0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
38e0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
38f0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
3900: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
3910: 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71  index.*/.void sq
3920: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73  lite3FreeIndex(s
3930: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
3940: 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
3950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
3960: 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  ZE.  sqlite3Dele
3970: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
3980: 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, p);.#endif.  
3990: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
39a0: 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64  e(db, p->pPartId
39b0: 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  xWhere);.  sqlit
39c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
39d0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72  (db, p->aColExpr
39e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
39f0: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3a00: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3a10: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3a20: 44 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64  DbFree(db, (void
3a30: 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23   *)p->azColl);.#
3a40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3a50: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3a60: 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  T4.  sqlite3_fre
3a70: 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a  e(p->aiRowEst);.
3a80: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3a90: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3aa0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3ab0: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
3ac0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
3ad0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
3ae0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
3af0: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
3b00: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
3b10: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
3b20: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
3b30: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
3b40: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
3b50: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3b60: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
3b70: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3b90: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3ba0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3bb0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3bc0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3bd0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3be0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
3bf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c00: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3c10: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3c20: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
3c30: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
3c40: 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64  >idxHash;.  pInd
3c50: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
3c60: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
3c70: 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66  dxName, 0);.  if
3c80: 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29  ( ALWAYS(pIndex)
3c90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
3ca0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3cb0: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
3cc0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
3cd0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
3ce0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
3d00: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20  ex *p;.      /* 
3d10: 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66  Justification of
3d20: 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20   ALWAYS();  The 
3d30: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e  index must be on
3d40: 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20   the list of.   
3d50: 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a     ** indices. *
3d60: 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64  /.      p = pInd
3d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3d80: 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
3d90: 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d   ALWAYS(p) && p-
3da0: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29  >pNext!=pIndex )
3db0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
3dc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
3dd0: 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  YS(p && p->pNext
3de0: 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  ==pIndex) ){.   
3df0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
3e00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3e10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3e20: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
3e30: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e40: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e50: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e60: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e70: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e80: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3ea0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3eb0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3ec0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ed0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ee0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ef0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3f00: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f10: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f20: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f30: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f40: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f50: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f60: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f70: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f80: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f90: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3fa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fb0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fc0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fd0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fe0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3ff0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4000: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4010: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4020: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4030: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4040: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4050: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4060: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4070: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4080: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4090: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
40a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40c0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40d0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40e0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40f0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
4100: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4110: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4120: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4130: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4140: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4150: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4160: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4170: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4180: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4190: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
41a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41b0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41c0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41d0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41e0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41f0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
4200: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4210: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4220: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4230: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4240: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4250: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4260: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4270: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4280: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4290: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
42a0: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42b0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42d0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42e0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42f0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
4300: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4310: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4320: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4330: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
4340: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
4350: 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b   ~DBFLAG_SchemaK
4360: 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69  nownOk;.  }..  i
4370: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4380: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ck==0 ){.    for
4390: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
43a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
43b0: 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
43c0: 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61  b, i, DB_ResetWa
43d0: 6e 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  nted) ){.       
43e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
43f0: 65 61 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ear(db->aDb[i].p
4400: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d  Schema);.      }
4410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4420: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
4430: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
4440: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
4450: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
4460: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
4470: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
4480: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
4490: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
44a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
44b0: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
44c0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
44d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
44e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
44f0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
4500: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
4510: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
4520: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4530: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4540: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
4550: 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65     if( db->nSche
4560: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4570: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4580: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
4590: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  hema);.      }el
45a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65  se{.        DbSe
45b0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  tProperty(db, i,
45c0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
45d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
45e0: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
45f0: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
4600: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
4610: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
4630: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4640: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4650: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66  aveAll(db);.  if
4660: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4670: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  k==0 ){.    sqli
4680: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4690: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
46a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
46b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46c0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
46d0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
46e0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
46f0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
4700: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
4710: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4720: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
4730: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  e;.}../*.** Dele
4740: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
4750: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
4760: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
4770: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
4780: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
4790: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64   array)..*/.void
47a0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
47b0: 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65  lumnNames(sqlite
47c0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
47d0: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
47e0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
47f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4800: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
4810: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
4820: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
4830: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
4840: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
4850: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4860: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4870: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4880: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4890: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
48a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
48b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
48c0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
48d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
48e0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
48f0: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4900: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4910: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4920: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4930: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4940: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4950: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4960: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
4970: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
4980: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
4990: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
49a0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
49b0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
49c0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
49d0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
49e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
49f0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4a00: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4a10: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4a20: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4a30: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4a40: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4a50: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4a60: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
4a70: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
4a80: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
4a90: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
4aa0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
4ab0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
4ac0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4ad0: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4ae0: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4af0: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4b00: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4b10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4b20: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4b30: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4b40: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4b50: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4b60: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
4b70: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
4b80: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
4b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
4ba0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c  ITE_NOINLINE del
4bb0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4bc0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4bd0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4be0: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a  Index, *pNext;..
4bf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4c00: 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  BUG.  /* Record 
4c10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
4c20: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73  tstanding lookas
4c30: 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ide allocations 
4c40: 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  in schema Tables
4c50: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64  .  ** prior to d
4c60: 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20  oing any free() 
4c70: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e  operations.  Sin
4c80: 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  ce schema Tables
4c90: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a   do not use.  **
4ca0: 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73   lookaside, this
4cb0: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e   number should n
4cc0: 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20  ot change. */.  
4cd0: 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  int nLookaside =
4ce0: 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20   0;.  if( db && 
4cf0: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4d00: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4d10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f  )==0 ){.    nLoo
4d20: 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33  kaside = sqlite3
4d30: 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62  LookasideUsed(db
4d40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
4d50: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4d60: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4d70: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4d80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4d90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4da0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4db0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4dc0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4dd0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4de0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4df0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4e00: 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20  Schema.         
4e10: 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54  || (IsVirtual(pT
4e20: 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d  able) && pIndex-
4e30: 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
4e40: 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29  _IDXTYPE_APPDEF)
4e50: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d   );.    if( (db=
4e60: 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  =0 || db->pnByte
4e70: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49  sFreed==0) && !I
4e80: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
4e90: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
4ea0: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
4eb0: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
4ec0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
4ed0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4ee0: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4ef0: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4f00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4f10: 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29  zName, 0.      )
4f20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4f30: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
4f40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4f50: 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
4f60: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
4f70: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4f80: 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30  Index || pOld==0
4f90: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4fa0: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64  lite3FreeIndex(d
4fb0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4fc0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4fd0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4fe0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4ff0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
5000: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
5010: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
5020: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
5030: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
5040: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
5050: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
5060: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
5070: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5080: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
5090: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
50a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
50b0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
50c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
50d0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
50e0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
50f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5100: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5110: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5120: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5130: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5140: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5150: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5160: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5170: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5180: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5190: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
51a0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
51b0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
51c0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
51d0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
51e0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
51f0: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5200: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5210: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5220: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5230: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5240: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5250: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
5260: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
5270: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
5280: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
5290: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
52a0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
52b0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
52c0: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
52d0: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
52e0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
52f0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5300: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5310: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5320: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5330: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5340: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5350: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5360: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5370: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5380: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5390: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
53a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
53b0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
53c0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
53d0: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
53e0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
53f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5400: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5410: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5420: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5440: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5450: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5460: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5470: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5480: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5490: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
54a0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
54b0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
54c0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
54d0: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
54e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
54f0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5500: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5510: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5520: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5530: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5550: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
5560: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5570: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5580: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5590: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
55a0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
55b0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
55c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
55d0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
55e0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
55f0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5600: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5610: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5620: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5630: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5640: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5650: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
5660: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5670: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5680: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5690: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
56a0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
56b0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
56c0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
56d0: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
56e0: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
56f0: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5700: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5710: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5720: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5730: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5740: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5750: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
5760: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5770: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5780: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5790: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
57a0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
57b0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
57c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
57d0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
57e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
57f0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5810: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5820: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5830: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5840: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5850: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
5860: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5870: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5880: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5890: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
58a0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
58b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
58c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
58d0: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
58e0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
58f0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5900: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5910: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5920: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5930: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5940: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5950: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5960: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5970: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5990: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
59a0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
59b0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
59c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
59d0: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
59e0: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
59f0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5a00: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5a10: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5a20: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5a30: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5a40: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5a50: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5a60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5a70: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5a80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a90: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5aa0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5ab0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5ac0: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5ad0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5ae0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5af0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5b00: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5b10: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5b20: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5b30: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5b40: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5b50: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5b60: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5b70: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5b80: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5b90: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ba0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5bb0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5bc0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5bd0: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5be0: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5bf0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5c00: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5c10: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5c20: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5c30: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5c40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5c70: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5c80: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5c90: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5ca0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5cb0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5cc0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5cd0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5ce0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5cf0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5d00: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5d10: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5d20: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5d30: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5d40: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5d50: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5d60: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5d70: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
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 20 20 20 20 20 2f 2a                /*
5da0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5db0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5dc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5de0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5df0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5e00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5e10: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5e20: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5e30: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5e40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5e60: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5e70: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5e80: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5e90: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5ea0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5eb0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5ec0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5ed0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5ee0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5ef0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5f00: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5f10: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5f20: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5f30: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5f40: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5f50: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5f60: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5f70: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5f80: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5f90: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5fa0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5fb0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5fc0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5fd0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5fe0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5ff0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
6000: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
6010: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
6020: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6030: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
6040: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
6050: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
6060: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
6070: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
6080: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
6090: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
60a0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
60b0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
60c0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
60d0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
60e0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
60f0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6100: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6110: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6120: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6130: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6140: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6150: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
6160: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
6170: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6180: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
6190: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
61a0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
61b0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
61c0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
61d0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
61f0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6200: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6210: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6220: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6230: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6240: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6250: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
6260: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
6270: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6280: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
6290: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
62a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
62b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
62c0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
62d0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
62e0: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
62f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6300: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6310: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6320: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6330: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6340: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6350: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6360: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6370: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
6380: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
6390: 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  || IN_RENAME_OBJ
63a0: 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  ECT.            
63b0: 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67   || (db->mDbFlag
63c0: 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75  s & DBFLAG_Vacuu
63d0: 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20  m)!=0);.    iDb 
63e0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
63f0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6400: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6410: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6420: 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41  * True if PRAGMA
6430: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
6440: 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71   is ON.*/.int sq
6450: 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68  lite3WritableSch
6460: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ema(sqlite3 *db)
6470: 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  {.  testcase( (d
6480: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6490: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
64a0: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
64b0: 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
64c0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  ( (db->flags&(SQ
64d0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
64e0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
64f0: 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  e))==.          
6500: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74       SQLITE_Writ
6510: 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73  eSchema );.  tes
6520: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6530: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6540: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6550: 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20  ensive))==.     
6560: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6570: 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20  _Defensive );.  
6580: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
6590: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
65a0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
65b0: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
65d0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
65e0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
65f0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  e) );.  return (
6600: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6610: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6620: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6630: 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  ==SQLITE_WriteSc
6640: 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hema;.}../*.** T
6650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6660: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6670: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6680: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
6690: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
66a0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
66b0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
66c0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
66d0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
66e0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
66f0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
6700: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
6710: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6720: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6730: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6740: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6750: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6760: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6770: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6780: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
6790: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
67a0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
67b0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
67c0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
67d0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
67e0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
67f0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
6800: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
6810: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6820: 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  a(pParse->db)==0
6830: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
6840: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6850: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6860: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6880: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6890: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
68a0: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
68b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
68c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
68d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
68e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
68f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
6900: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
6910: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
6920: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
6930: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
6940: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6950: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6960: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6970: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6980: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6990: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
69a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
69b0: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
69c0: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
69d0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
69e0: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
69f0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
6a00: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
6a10: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
6a20: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
6a30: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
6a40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6a50: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6a60: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6a70: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6a80: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6a90: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6aa0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6ab0: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6ac0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6ad0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6ae0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
6af0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
6b00: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
6b10: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
6b20: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
6b30: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
6b40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6b50: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6b60: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6b70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6b80: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6b90: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6ba0: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6bb0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6bc0: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6bd0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6be0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
6bf0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
6c00: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
6c10: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
6c20: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
6c30: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
6c40: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6c50: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6c60: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6c70: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6c80: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6c90: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6ca0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6cb0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6cc0: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6cd0: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6ce0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
6cf0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
6d00: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6d10: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6d20: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6d30: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6d40: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6d50: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6d60: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6d70: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6d80: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6d90: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6da0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6db0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6dc0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6dd0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6de0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6df0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
6e00: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
6e10: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6e20: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6e30: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6e40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6e50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6e60: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6e70: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6e80: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6e90: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6ea0: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6eb0: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6ec0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6ed0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6ee0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6ef0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6f00: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
6f10: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6f20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6f30: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6f40: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6f50: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6f60: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6f70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6f80: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6f90: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6fa0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6fb0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6fc0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6fd0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6fe0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6ff0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
7000: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7010: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
7020: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
7030: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7040: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
7050: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
7060: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
7070: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
7080: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
7090: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
70a0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
70b0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
70c0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
70d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
70e0: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
70f0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
7100: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
7110: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
7120: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
7130: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
7140: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7150: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
7160: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
7170: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
7180: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
7190: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
71a0: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
71b0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
71c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
71d0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
71e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
71f0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
7200: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
7210: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
7220: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
7230: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
7240: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
7250: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
7260: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
7270: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
7280: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
7290: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
72a0: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
72b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
72c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
72d0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
72e0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
72f0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
7300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7310: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
7320: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
7330: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
7340: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
7350: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7360: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
7370: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
7380: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
7390: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
73a0: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
73b0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
73c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
73d0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
73e0: 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e  *pName;.  if( zN
73f0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
7400: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
7410: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
7420: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
7430: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
7440: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7450: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
7460: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
7470: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
7480: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7490: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
74a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d  .  assert( isTem
74b0: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
74c0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
74d0: 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
74e0: 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20  ew==1 );.  {.   
74f0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7500: 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   aCode[] = {.   
7510: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7520: 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  E_TABLE,.       
7530: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7540: 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  MP_TABLE,.      
7550: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
7560: 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  IEW,.       SQLI
7570: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7580: 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  IEW.    };.    c
7590: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
75a0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
75b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
75c0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
75d0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
75e0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
75f0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
7600: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
7610: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7620: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
7630: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
7640: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
7650: 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65  arse, (int)aCode
7660: 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77  [isTemp+2*isView
7670: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
76a0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
76b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
76c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
76d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
76e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
76f0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
7700: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
7710: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
7720: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
7730: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
7740: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
7750: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
7760: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
7770: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
7780: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
7790: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
77a0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
77b0: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
77c0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
77d0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
77e0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
77f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
7800: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
7810: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
7820: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
7830: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
7840: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
7850: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
7860: 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
7870: 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  E ){.    char *z
7880: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7890: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
78a0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
78b0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
78c0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
78d0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
78e0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
78f0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
7900: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
7910: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
7920: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
7930: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
7940: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
7950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7960: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
7970: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
7980: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
7990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
79a0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
79b0: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
79c0: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
79d0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
79e0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
79f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7a00: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7a10: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7a20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
7a30: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
7a40: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7a50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7a60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7a70: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
7a80: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
7a90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
7aa0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7ab0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7ac0: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
7ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7ae0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
7af0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
7b00: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
7b10: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
7b20: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
7b30: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7b40: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
7b50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7b60: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
7b70: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
7b80: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
7b90: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
7ba0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
7bb0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
7bc0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
7bd0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7be0: 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  le->nTabRef = 1;
7bf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7c00: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20  EFAULT_ROWEST.  
7c10: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7c20: 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
7c30: 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  st(SQLITE_DEFAUL
7c40: 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65  T_ROWEST);.#else
7c50: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7c60: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7c70: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7c80: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
7c90: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
7ca0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
7cb0: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7cc0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7cd0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7ce0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7cf0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7d00: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7d10: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7d20: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7d30: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7d40: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7d50: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7d60: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
7d70: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
7d80: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
7d90: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
7da0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7db0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7dc0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7dd0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7de0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7df0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7e10: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7e20: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7e30: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7e40: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7e50: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
7e60: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
7e70: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
7e80: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
7e90: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
7ea0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
7eb0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7ec0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7ed0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7ee0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7ef0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7f00: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7f10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7f20: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
7f30: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
7f40: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
7f50: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
7f60: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
7f70: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
7f80: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
7f90: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
7fa0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
7fb0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
7fc0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
7fd0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7fe0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7ff0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
8000: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
8010: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
8020: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
8030: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
8040: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8050: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
8060: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
8070: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
8080: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
8090: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
80a0: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
80b0: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
80c0: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
80d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
80e0: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
80f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
8100: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
8110: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
8120: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
8130: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8140: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
8150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8160: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8170: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
8180: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
8190: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
81a0: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
81b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
81c0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
81d0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
81e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
81f0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
8200: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
8210: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
8220: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
8230: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
8240: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8250: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
8260: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
8270: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8280: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
8290: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
82a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
82b0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
82c0: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
82d0: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
82e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
82f0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
8300: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
8310: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8320: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
8330: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8340: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
8350: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8360: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
8370: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
8380: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
8390: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
83a0: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
83b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
83c0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
83d0: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
83e0: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
83f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8410: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8420: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
8430: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
8440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
8450: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
8460: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
8470: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
8480: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
8490: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
84a0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
84b0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
84c0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
84d0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
84e0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
84f0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
8500: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
8510: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
8520: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
8530: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
8540: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
8550: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
8560: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
8570: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
8580: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
8590: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
85a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
85b0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
85c0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
85d0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
85e0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
85f0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
8600: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
8610: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
8620: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
8630: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
8640: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8660: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8670: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8680: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8690: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
86a0: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
86b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
86c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
86d0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
86e0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
86f0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
8700: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
8710: 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71  ab =.         sq
8720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8730: 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
8740: 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54  e, iDb, reg2, BT
8750: 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20  REE_INTKEY);.   
8760: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
8770: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
8780: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87a0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
87b0: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
87c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87d0: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
87e0: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
87f0: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
8800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8810: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
8820: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
8830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8840: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8850: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
8860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8870: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
8880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
8890: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
88a0: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
88b0: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
88c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
88d0: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
88e0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
88f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8900: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
8910: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
8920: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
8930: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
8940: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
8950: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
8960: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
8970: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8980: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
8990: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
89a0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
89b0: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
89c0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
89d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
89e0: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
89f0: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
8a00: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
8a10: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8a20: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
8a30: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
8a40: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
8a50: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
8a60: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
8a70: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
8a80: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
8a90: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
8aa0: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
8ab0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8ac0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8ad0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8ae0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8af0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8b00: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8b10: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
8b20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
8b30: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
8b40: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8b50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8b60: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8b70: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8b80: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8b90: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8bb0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8bc0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8bd0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8be0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8bf0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8c00: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
8c10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8c20: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8c30: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
8c40: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8c50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8c60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8c70: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8c80: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8c90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
8ca0: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8cb0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8cc0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8cd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ce0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8cf0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8d00: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8d10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
8d20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8d30: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8d40: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
8d50: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8d60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f  eturn;.  if( IN_
8d70: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20  RENAME_OBJECT ) 
8d80: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
8d90: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
8da0: 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a  oid*)z, pName);.
8db0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8dc0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8dd0: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8de0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8df0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8e00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8e10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8e20: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8e30: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8e40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8e50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8e60: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8e70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8e80: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8e90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8ea0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8eb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8ec0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8ee0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8ef0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8f00: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8f10: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8f20: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8f30: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8f40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f50: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8f60: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8f70: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8f80: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8f90: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8fa0: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8fb0: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8fc0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8fd0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8ff0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
9000: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
9010: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
9020: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
9030: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
9040: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
9050: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
9060: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
9070: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
9080: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
9090: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
90a0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
90b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
90c0: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
90d0: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
90e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
90f0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
9100: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
9110: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9120: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9130: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9140: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9150: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9160: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9170: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
9180: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9190: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
91a0: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
91b0: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
91c0: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
91d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
91e0: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
91f0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
9200: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
9210: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
9220: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
9230: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
9240: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
9250: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
9260: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
9270: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
9280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9290: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
92a0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
92b0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
92c0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
92d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
92e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
92f0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
9300: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
9310: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
9320: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9330: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9340: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9350: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9360: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9370: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9380: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
93a0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
93b0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
93c0: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
93d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
93e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
93f0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9400: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9410: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9420: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9430: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9440: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9450: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9460: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9470: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9480: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9490: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
94a0: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
94b0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
94c0: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
94d0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
94e0: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
94f0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9500: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
9510: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9520: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9530: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9540: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9550: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9560: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9580: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9590: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
95a0: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
95b0: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
95c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
95d0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
95e0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
95f0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
9600: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
9610: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
9620: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9630: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9640: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
9650: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
9660: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9670: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9680: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9690: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
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 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
96c0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
96d0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
96e0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
96f0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
9700: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
9710: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
9720: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9730: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
9740: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
9750: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
9760: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9770: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9780: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
97a0: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
97b0: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
97f0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
9800: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
9810: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9820: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9830: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9840: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9850: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
9860: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9870: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9880: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9890: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
98a0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
98b0: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
98c0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
98d0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
98e0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
98f0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
9900: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
9910: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
9920: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9930: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
9940: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9950: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9960: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9970: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9980: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9990: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
99a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
99b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
99c0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
99d0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
99e0: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
99f0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9a00: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9a10: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9a20: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9a30: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9a40: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9a50: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9a60: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9a70: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9a80: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9a90: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9aa0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9ab0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9ad0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9ae0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9af0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9b00: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9b10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9b20: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9b30: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9b40: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9b50: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9b60: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9b70: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9b80: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9b90: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9ba0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9bb0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9bc0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9bd0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9be0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9bf0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9c00: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9c10: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9c20: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9c30: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9c40: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9c50: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9c60: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9c70: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9c80: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9c90: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9ca0: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9cb0: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9cc0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9cd0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9ce0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9cf0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9d00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9d10: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9d20: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9d30: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9d40: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9d50: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9d60: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9d70: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9d80: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9d90: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9da0: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9db0: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9dd0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9de0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9df0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9e00: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9e10: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9e20: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9e30: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9e40: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9e50: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9e60: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9e70: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9e80: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9ea0: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9eb0: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9ec0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9ed0: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9ee0: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9ef0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9f00: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9f10: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9f20: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9f30: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9f40: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9f50: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9f60: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9f70: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9f80: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9f90: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9fa0: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9fb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9fc0: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9fd0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9ff0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
a000: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
a010: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
a020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
a030: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
a040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
a050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a060: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
a070: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
a080: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a090: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
a0a0: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
a0b0: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
a0c0: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
a0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
a0e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a0f0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
a100: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
a110: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a120: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
a130: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
a140: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a150: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
a160: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
a170: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
a180: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
a190: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
a1a0: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
a1b0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
a1c0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
a1d0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
a1e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
a1f0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a200: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
a210: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
a220: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a230: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
a240: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
a250: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
a260: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
a270: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
a280: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
a290: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
a2a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a2b0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
a2c0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
a2d0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
a2e0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
a2f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a300: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a310: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
a320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a330: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a340: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a350: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a370: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a380: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a390: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a3b0: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a3c0: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a3d0: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a3e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a3f0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a400: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a410: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a420: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a430: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a440: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a460: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a470: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a480: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a490: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a4a0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a4b0: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a4c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a4d0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a4e0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a4f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a510: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a520: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a530: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a540: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a560: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a570: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a580: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a590: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a5a0: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a5b0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a5c0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a5d0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a5e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a5f0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a600: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a610: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a620: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a630: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a640: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a650: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a660: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a670: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a680: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a690: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a6a0: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a6b0: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a6c0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a6d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a6e0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a6f0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a700: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a710: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a720: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49     }.  }.  if( I
a730: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
a740: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
a750: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
a760: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
a770: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
a780: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
a790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
a7a0: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
a7b0: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
a7c0: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
a7d0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
a7e0: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
a7f0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
a800: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
a810: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
a820: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
a830: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
a840: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
a850: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
a860: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
a870: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
a880: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
a890: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
a8a0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
a8b0: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
a8c0: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
a8d0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
a8e0: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
a8f0: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
a900: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
a910: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
a920: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
a930: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
a940: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a950: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
a960: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
a970: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
a980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
a990: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
a9a0: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
a9b0: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
a9c0: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
a9d0: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
a9e0: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
a9f0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
aa00: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
aa10: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
aa20: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
aa30: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
aa40: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
aa50: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
aa60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
aa70: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
aa80: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
aa90: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
aaa0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
aab0: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
aac0: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
aad0: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
aae0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
aaf0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
ab00: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
ab10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ab20: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
ab30: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
ab40: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
ab50: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
ab60: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
ab70: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
ab80: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
ab90: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
aba0: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
abb0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
abc0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
abd0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
abe0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
abf0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
ac00: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
ac10: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
ac20: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
ac30: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
ac40: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
ac50: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
ac60: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
ac70: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
ac80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
ac90: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
aca0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
acb0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
acc0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
acd0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
ace0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
acf0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
ad00: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
ad10: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
ad20: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
ad30: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
ad40: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
ad50: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
ad60: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
ad70: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
ad80: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
ad90: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
ada0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
adb0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
adc0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
add0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ade0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
adf0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
ae00: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
ae10: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
ae20: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
ae30: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
ae40: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
ae50: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
ae60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
ae70: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ae80: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ae90: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
aea0: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
aeb0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
aec0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
aed0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
aee0: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
aef0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
af00: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
af10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
af20: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
af30: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
af40: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
af50: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
af60: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
af70: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
af80: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
af90: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
afa0: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
afb0: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
afc0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
afd0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
afe0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
aff0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
b000: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
b010: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
b020: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
b030: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b040: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
b050: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
b060: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
b070: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
b080: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
b090: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
b0a0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
b0b0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
b0c0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
b0d0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
b0e0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
b0f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
b100: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
b110: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
b120: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
b130: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
b140: 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  KEY;.    nTerm =
b150: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
b160: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
b170: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
b180: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
b190: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b1a0: 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
b1b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
b1c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b1d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b1e0: 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20   pCExpr!=0 );.  
b1f0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
b200: 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20  gToId(pCExpr);. 
b210: 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d       if( pCExpr-
b220: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
b230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b240: 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70   *zCName = pCExp
b250: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
b260: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
b270: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b280: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
b290: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b2a0: 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20  StrICmp(zCName, 
b2b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b2c0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
b2d0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
b2e0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
b2f0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l];.            
b300: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b310: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b320: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  Y;.            b
b330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b340: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b350: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b360: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
b370: 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71  && pCol.   && sq
b380: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c  lite3StrICmp(sql
b390: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
b3a0: 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45  Col,""), "INTEGE
b3b0: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
b3c0: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
b3d0: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
b3e0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
b3f0: 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  JECT && pList ){
b400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b410: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
b420: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
b430: 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Key, pList->a[0]
b440: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
b450: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
b460: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
b470: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
b480: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
b490: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
b4a0: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
b4b0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
b4c0: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
b4d0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
b4e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
b4f0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
b500: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
b510: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
b520: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
b530: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
b540: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b550: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
b560: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b570: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
b580: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
b590: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
b5a0: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
b5b0: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
b5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b5d0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
b5e0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
b5f0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
b600: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b620: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
b630: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
b640: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
b650: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
b660: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b670: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
b680: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b690: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
b6a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b6b0: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
b6c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
b6d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
b6e0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
b6f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
b700: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
b710: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
b720: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b730: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b740: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
b750: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
b760: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
b770: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b780: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b790: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b7a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b7b0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b7c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b7d0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
b7e0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
b7f0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b800: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b810: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b820: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b830: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b840: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b850: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b860: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b870: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b880: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b890: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b8a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b8b0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b8c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b8d0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b8e0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b8f0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b900: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b910: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
b920: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
b930: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b940: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
b950: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
b960: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b970: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
b980: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
b990: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
b9a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b9b0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
b9c0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
b9d0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
b9e0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
b9f0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ba10: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
ba20: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ba30: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
ba40: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
ba50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ba60: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
ba70: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
ba80: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
ba90: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
baa0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
bab0: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
bac0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
bad0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
bae0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
baf0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
bb00: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
bb10: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
bb20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
bb30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
bb40: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
bb50: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
bb60: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
bb70: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
bb80: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
bb90: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
bba0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
bbb0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
bbc0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
bbd0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
bbe0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
bbf0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
bc00: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
bc10: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
bc20: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
bc30: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
bc40: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
bc50: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
bc60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
bc70: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
bc80: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
bc90: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
bca0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
bcb0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
bcc0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
bcd0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
bce0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bcf0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bd00: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
bd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bd20: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
bd30: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
bd40: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
bd50: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
bd60: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
bd70: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
bd80: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
bd90: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
bda0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
bdb0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bdc0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
bdd0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
bde0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
bdf0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
be00: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
be10: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
be20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
be30: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
be40: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
be50: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
be60: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
be70: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
be80: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
be90: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
bea0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
beb0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
bec0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
bed0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
bee0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
bef0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
bf00: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
bf10: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
bf20: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
bf30: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
bf40: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
bf50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bf60: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
bf70: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
bf80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
bf90: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
bfa0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bfb0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
bfc0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
bfd0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bfe0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
bff0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
c000: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
c010: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
c020: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
c030: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
c040: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c050: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
c060: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
c070: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
c080: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
c090: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c0a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
c0b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c0c0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
c0d0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
c0e0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
c0f0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
c100: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
c110: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
c120: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
c130: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
c140: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
c150: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
c160: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
c170: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
c180: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
c190: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
c1a0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
c1b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
c1c0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
c1d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
c1e0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
c1f0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
c200: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
c210: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
c220: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c230: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
c240: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
c250: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
c260: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
c270: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
c280: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
c290: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
c2a0: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
c2b0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
c2c0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
c2d0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
c2e0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
c2f0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
c300: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
c310: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
c320: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
c330: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
c340: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
c350: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
c360: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
c370: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
c380: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
c390: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
c3a0: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
c3b0: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
c3c0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
c3d0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
c3e0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
c3f0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
c400: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
c410: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
c420: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
c430: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
c440: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
c450: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
c460: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
c470: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
c480: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
c490: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  ough..**.** IMPL
c4a0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
c4b0: 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c  -34230-56049 SQL
c4c0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
c4d0: 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20  y increments.** 
c4e0: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
c4f0: 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  on whenever the 
c500: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
c510: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c520: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
c530: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c540: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
c550: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c560: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c570: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
c580: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c590: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c5a0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
c5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c5c0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
c5d0: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
c5e0: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20  MA_VERSION, .   
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65  (int)(1+(unsigne
c610: 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  d)db->aDb[iDb].p
c620: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
c630: 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ookie));.}../*.*
c640: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
c650: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
c660: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
c670: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
c680: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
c690: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
c6a0: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
c6b0: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
c6c0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
c6d0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
c6e0: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
c6f0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
c700: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
c710: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
c720: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
c730: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
c740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
c750: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
c760: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
c770: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
c780: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
c790: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
c7a0: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
c7b0: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
c7c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
c7d0: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c7e0: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
c7f0: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
c800: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
c810: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c820: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
c830: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
c840: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
c850: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
c860: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c870: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
c880: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
c890: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
c8a0: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
c8b0: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
c8c0: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
c8d0: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
c8e0: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
c8f0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
c900: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
c910: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
c920: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
c930: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
c940: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
c950: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
c960: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
c970: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
c980: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
c990: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
c9a0: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
c9b0: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
c9c0: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
c9d0: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
c9e0: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
c9f0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
ca00: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
ca10: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
ca20: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
ca30: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
ca40: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
ca50: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
ca60: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
ca70: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
ca80: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
ca90: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
caa0: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
cab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
cac0: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
cad0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
cae0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
caf0: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
cb00: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
cb10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
cb20: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
cb30: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
cb40: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
cb50: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
cb60: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
cb70: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
cb80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
cb90: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
cba0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
cbb0: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
cbc0: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
cbd0: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
cbe0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
cbf0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
cc00: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
cc10: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
cc20: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
cc30: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
cc40: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
cc50: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
cc60: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
cc70: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
cc80: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
cc90: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
cca0: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
ccb0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ccc0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
ccd0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
cce0: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
ccf0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
cd00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
cd10: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
cd20: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
cd30: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
cd40: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
cd50: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
cd60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
cd70: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
cd80: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
cd90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
cda0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
cdb0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
cdc0: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
cdd0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
cde0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
cdf0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
ce00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
ce10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
ce20: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
ce30: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
ce40: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
ce50: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
ce60: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
ce70: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
ce80: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
ce90: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
cea0: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
ceb0: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
cec0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
ced0: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
cee0: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
cef0: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
cf00: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
cf10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
cf20: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
cf30: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
cf40: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
cf50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
cf60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
cf70: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
cf80: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
cf90: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
cfa0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
cfb0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
cfc0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
cfd0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
cfe0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
cff0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
d000: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
d010: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
d020: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
d030: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
d040: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
d050: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
d060: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
d070: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
d080: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
d090: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d0a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
d0b0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
d0c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d0d0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
d0e0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
d0f0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
d100: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
d110: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
d120: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d130: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
d140: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
d150: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
d160: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
d170: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
d180: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
d190: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
d1a0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
d1b0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
d1c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
d1d0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
d1e0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
d1f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d200: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
d210: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d220: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
d230: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
d240: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
d250: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d260: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
d270: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d280: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d290: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
d2a0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d2b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d2c0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
d2d0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d2e0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d2f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
d300: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d310: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d320: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
d330: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
d340: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
d350: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
d360: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
d370: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
d380: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
d390: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
d3a0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3b0: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
d3c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
d3d0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
d3e0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
d3f0: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
d400: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
d410: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
d420: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
d430: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
d440: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
d450: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
d460: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
d470: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
d480: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
d490: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
d4a0: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
d4b0: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
d4c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
d4d0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
d4e0: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
d4f0: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
d500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d510: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d520: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
d530: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
d540: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
d550: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
d560: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
d570: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
d580: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
d590: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
d5a0: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
d5b0: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
d5c0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
d5d0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
d5e0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
d5f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d600: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
d610: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d620: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
d630: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
d640: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
d650: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
d660: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d670: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
d680: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74  onst char**)zExt
d690: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
d6a0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b  sizeof(char*)*N;
d6b0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d6c0: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
d6d0: 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49  , sizeof(i16)*pI
d6e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d6f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
d700: 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20   (i16*)zExtra;. 
d710: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
d720: 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63  f(i16)*N;.  memc
d730: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d740: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64  >aSortOrder, pId
d750: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d760: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
d770: 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20  = (u8*)zExtra;. 
d780: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d790: 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65   N;.  pIdx->isRe
d7a0: 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74  sized = 1;.  ret
d7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d7c0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d7d0: 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77   the total row w
d7e0: 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65  idth for a table
d7f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d800: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
d810: 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dth(Table *pTab)
d820: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61  {.  unsigned wTa
d830: 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ble = 0;.  const
d840: 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
d850: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
d860: 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  (i=pTab->nCol, p
d870: 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
d880: 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61  l; i>0; i--, pTa
d890: 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61  bCol++){.    wTa
d8a0: 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e  ble += pTabCol->
d8b0: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  szEst;.  }.  if(
d8c0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29   pTab->iPKey<0 )
d8d0: 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61   wTable++;.  pTa
d8e0: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
d8f0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62  lite3LogEst(wTab
d900: 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le*4);.}../*.** 
d910: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
d920: 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72  rage size of a r
d930: 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  ow for an index.
d940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d950: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
d960: 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  th(Index *pIdx){
d970: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64  .  unsigned wInd
d980: 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ex = 0;.  int i;
d990: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
d9a0: 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54  *aCol = pIdx->pT
d9b0: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f  able->aCol;.  fo
d9c0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
d9d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d9e0: 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e    i16 x = pIdx->
d9f0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
da00: 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d   assert( x<pIdx-
da10: 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b  >pTable->nCol );
da20: 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78  .    wIndex += x
da30: 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49  <0 ? 1 : aCol[pI
da40: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
da50: 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49  .szEst;.  }.  pI
da60: 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  dx->szIdxRow = s
da70: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e  qlite3LogEst(wIn
da80: 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  dex*4);.}../* Re
da90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c  turn true if val
daa0: 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e  ue x is found an
dab0: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
dac0: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
dad0: 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63  iCol[].*/.static
dae0: 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63   int hasColumn(c
daf0: 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c  onst i16 *aiCol,
db00: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78   int nCol, int x
db10: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c  ){.  while( nCol
db20: 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d  -- > 0 ) if( x==
db30: 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74  *(aiCol++) ) ret
db40: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
db50: 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75  0;.}../* Recompu
db60: 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78  te the colNotIdx
db70: 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ed field of the 
db80: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c  Index..**.** col
db90: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69  NotIdxed is a bi
dba0: 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61  tmask that has a
dbb0: 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74   0 bit represent
dbc0: 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64  ing each indexed
dbd0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
dbe0: 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
dbf0: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
dc00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
dc10: 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65  The.** high-orde
dc20: 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49  r bit of colNotI
dc30: 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31  dxed is always 1
dc40: 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64  .  All unindexed
dc50: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
dc60: 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20  he table have a 
dc70: 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  1..**.** The col
dc80: 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73  NotIdxed mask is
dc90: 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65   AND-ed with the
dca0: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c   SrcList.a[].col
dcb0: 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20  Used mask.** to 
dcc0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
dcd0: 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69   index is coveri
dce0: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ng index..*/.sta
dcf0: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75  tic void recompu
dd00: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
dd10: 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29  xed(Index *pIdx)
dd20: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
dd30: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
dd40: 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
dd50: 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
dd60: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
dd70: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
dd80: 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
dd90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dda0: 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
ddb0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
ddc0: 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
ddd0: 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
dde0: 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
ddf0: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63   }.  }.  pIdx->c
de00: 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b  olNotIdxed = ~m;
de10: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
de20: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36  ->colNotIdxed>>6
de30: 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3)==1 );.}../*.*
de40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
de50: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
de60: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
de70: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
de80: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
de90: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
dea0: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
deb0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dec0: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
ded0: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
dee0: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
def0: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
df00: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
df10: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
df20: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
df30: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
df40: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
df50: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
df60: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
df70: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
df80: 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c      (1)  Set all
df90: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
dfa0: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
dfb0: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
dfc0: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
dfd0: 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33   (2)  Convert P3
dfe0: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
dff0: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
e000: 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b   from BTREE_INTK
e010: 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EY .**          
e020: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
e030: 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  EY..**     (3)  
e040: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e050: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
e060: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
e070: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
e080: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
e090: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
e0a0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
e0b0: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
e0c0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
e0d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e0e0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
e0f0: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
e100: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
e110: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
e120: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e130: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
e140: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
e150: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
e160: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
e170: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
e180: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
e190: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e1a0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e1b0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e1c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
e1d0: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
e1e0: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
e1f0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
e200: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
e210: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
e220: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
e230: 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72  nAllField and ar
e240: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
e250: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
e260: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
e270: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
e280: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
e290: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
e2a0: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
e2b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
e2c0: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
e2d0: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
e2e0: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
e2f0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   KEY columns..**
e300: 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20  .** For virtual 
e310: 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29  tables, only (1)
e320: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
e330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e340: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e350: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
e360: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e370: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
e380: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
e390: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
e3a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
e3b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e3c0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
e3d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e3e0: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
e3f0: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
e400: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
e410: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
e420: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
e430: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
e440: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e450: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e460: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
e480: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
e490: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
e4a0: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
e4b0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
e4c0: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
e4d0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
e4e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
e4f0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
e500: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
e510: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
e520: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
e530: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
e540: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
e550: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
e560: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
e570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
e580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e590: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
e5a0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
e5b0: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
e5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
e5d0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e5e0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
e5f0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
e600: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
e610: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
e620: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
e630: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
e640: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
e650: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
e660: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
e670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
e680: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
e690: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
e6a0: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
e6b0: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
e6c0: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
e6d0: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
e6e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
e6f0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
e700: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e710: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
e720: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
e730: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
e740: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e750: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e760: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
e770: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
e780: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
e790: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
e7a0: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
e7b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
e7c0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
e7d0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
e7e0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
e7f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
e820: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
e830: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
e840: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
e850: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
e860: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
e870: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e880: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
e890: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
e8a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e8b0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
e8c0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
e8d0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
e8e0: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
e8f0: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
e900: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
e910: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
e920: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
e930: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
e940: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
e950: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
e960: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
e970: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
e980: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
e990: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
e9a0: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
e9b0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
e9c0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
e9d0: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
e9e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e9f0: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
ea00: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
ea10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
ea20: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
ea30: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
ea40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ea50: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
ea60: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
ea70: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
ea80: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
ea90: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
eaa0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
eab0: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
eac0: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
ead0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
eae0: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
eaf0: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
eb00: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
eb10: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73  Col;..  /* Bypas
eb20: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
eb30: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
eb40: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
eb50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
eb60: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
eb70: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
eb80: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
eb90: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
eba0: 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72  BE.  ** code for
ebb0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ebc0: 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e  (not when parsin
ebd0: 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66  g one as part of
ebe0: 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20   reading.  ** a 
ebf0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
ec00: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
ec10: 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a   pPk->tnum>0 ){.
ec20: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
ec30: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
ec40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ec50: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
ec60: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
ec70: 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  o);.  }..  /* Th
ec80: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
ec90: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
eca0: 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  s the table root
ecb0: 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e   page */.  pPk->
ecc0: 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  tnum = pTab->tnu
ecd0: 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  m;..  /* Update 
ece0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
ecf0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ed00: 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63  all UNIQUE indic
ed10: 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  es by converting
ed20: 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
ed30: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  rowid column int
ed40: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  o one or more co
ed50: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
ed60: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20  MARY KEY..  */. 
ed70: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
ed80: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
ed90: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
eda0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
edb0: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
edc0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
edd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ede0: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
edf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ee00: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ee10: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ee20: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ee30: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ee50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
ee60: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
ee70: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
ee80: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
ee90: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
eea0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
eeb0: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
eec0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
eed0: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
eee0: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
eef0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
ef00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
ef10: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
ef20: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
ef30: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ef40: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ef50: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ef60: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ef70: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
ef80: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
ef90: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
efa0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
efb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
efc0: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
efd0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
efe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f000: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
f010: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
f020: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f030: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
f040: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
f050: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
f060: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f070: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
f080: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
f090: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
f0a0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
f0b0: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
f0c0: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
f0d0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
f0e0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
f0f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
f100: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
f110: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
f120: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f130: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
f140: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
f150: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
f160: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
f170: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74  zColl[j] = sqlit
f180: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
f190: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
f1a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
f1b0: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
f1c0: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
f1d0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
f1e0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
f1f0: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
f200: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
f210: 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
f220: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b  nsNotIndexed(pPk
f230: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
f240: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f250: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74  LTABLE./*.** Ret
f260: 75 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d  urn true if zNam
f270: 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61  e is a shadow ta
f280: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
f290: 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
f2a0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
f2b0: 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74  **.** zName is t
f2c0: 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66  emporarily modif
f2d0: 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72  ied while this r
f2e0: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e  outine is runnin
f2f0: 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73  g, but is.** res
f300: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f310: 67 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f  ginal value prio
f320: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
f330: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
f340: 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61  static int isSha
f350: 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c  dowTableName(sql
f360: 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a  ite3 *db, char *
f370: 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  zName){.  char *
f380: 7a 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20  zTail;          
f390: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f3a0: 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22  er to the last "
f3b0: 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  _" in zName */. 
f3c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3e0: 2a 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61  * Table that zNa
f3f0: 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f  me is a shadow o
f400: 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70  f */.  Module *p
f410: 4d 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mod;            
f420: 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66       /* Module f
f430: 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
f440: 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c  able */..  zTail
f450: 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65   = strrchr(zName
f460: 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54  , '_');.  if( zT
f470: 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ail==0 ) return 
f480: 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  0;.  *zTail = 0;
f490: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
f4a0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
f4b0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61  Name, 0);.  *zTa
f4c0: 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20  il = '_';.  if( 
f4d0: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
f4e0: 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72   0;.  if( !IsVir
f4f0: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
f500: 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20  urn 0;.  pMod = 
f510: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
f520: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
f530: 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d  odule, pTab->azM
f540: 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20  oduleArg[0]);.  
f550: 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65  if( pMod==0 ) re
f560: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d  turn 0;.  if( pM
f570: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65  od->pModule->iVe
f580: 72 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e  rsion<3 ) return
f590: 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
f5a0: 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77  pModule->xShadow
f5b0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
f5c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f   0;.  return pMo
f5d0: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61  d->pModule->xSha
f5e0: 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29  dowName(zTail+1)
f5f0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
f600: 6e 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65  ne isShadowTable
f610: 4e 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64  Name(x,y) 0.#end
f620: 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
f630: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f640: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
f650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f660: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
f670: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
f680: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
f690: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
f6a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
f6b0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
f6c0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
f6d0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
f6e0: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
f6f0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
f700: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
f710: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
f720: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
f730: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
f740: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
f750: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
f760: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
f770: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
f780: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
f790: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
f7a0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
f7b0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
f7c0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
f7d0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
f7e0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
f7f0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f800: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
f810: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
f820: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
f830: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
f840: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f850: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
f860: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
f870: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
f880: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
f890: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
f8a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f8b0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
f8c0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
f8d0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
f8e0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
f8f0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
f900: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
f910: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
f920: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
f930: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
f940: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
f950: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
f960: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
f970: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
f980: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
f990: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
f9a0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
f9b0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
f9c0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
f9d0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
f9e0: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
f9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fa00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
fa10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
fa20: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
fa30: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
fa40: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
fa50: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
fa60: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
fa70: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
fa80: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
fa90: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
faa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
fab0: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
fac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
fad0: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
fae0: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
faf0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
fb00: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
fb10: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
fb20: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
fb30: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
fb40: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
fb50: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
fb60: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
fb70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fb80: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
fb90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
fba0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbc0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
fbd0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
fbe0: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
fbf0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
fc00: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
fc10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
fc20: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e  le */..  if( pEn
fc30: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
fc40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
fc50: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fc60: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
fc70: 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  d );.  p = pPars
fc80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
fc90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
fca0: 6e 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  n;..  if( pSelec
fcb0: 74 3d 3d 30 20 26 26 20 69 73 53 68 61 64 6f 77  t==0 && isShadow
fcc0: 54 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d  TableName(db, p-
fcd0: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 70  >zName) ){.    p
fce0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
fcf0: 5f 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20  _Shadow;.  }..  
fd00: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
fd10: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
fd20: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
fd30: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
fd40: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
fd50: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
fd60: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
fd70: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
fd80: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
fd90: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
fda0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
fdb0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
fdc0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
fdd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
fde0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
fdf0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
fe00: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
fe10: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
fe20: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
fe30: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
fe40: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
fe50: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
fe60: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fe70: 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
fe80: 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
fe90: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
fea0: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
feb0: 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
fec0: 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
fed0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
fee0: 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  {.    if( pSelec
fef0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
ff00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ff10: 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  e, "");.      re
ff20: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
ff30: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
ff40: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
ff50: 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
ff60: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
ff70: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
ff80: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
ff90: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
ffa0: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
ffb0: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
ffc0: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
ffd0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ffe0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
fff0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10000 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10010 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10020 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
10030 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
10040 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
10050 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
10060 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10070 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
10080 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10090 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
100b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
100c0 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
100d0 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
100e0 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
100f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10100 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
10110 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
10120 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
10130 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
10140 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
10150 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
10160 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
10170 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10180 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10190 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
101a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
101b0 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
101c0 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
101d0 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
101e0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
101f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
10200 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
10210 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
10220 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
10230 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
10240 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
10250 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10260 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10270 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
10280 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
10290 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
102a0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
102b0 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
102c0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
102d0 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
102e0 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
102f0 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
10300 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
10310 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
10320 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
10330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
10340 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
10350 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
10360 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
10370 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
10380 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10390 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
103a0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
103b0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
103c0 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
103d0 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
103e0 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
103f0 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
10400 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
10410 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
10420 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
10430 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
10440 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
10450 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
10460 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
10470 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
10480 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
10490 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
104a0 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
104b0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
104c0 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
104d0 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
104e0 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
104f0 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
10500 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
10510 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10520 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
10530 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
10540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10550 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10560 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
10570 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
10580 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
10590 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
105a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
105b0 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
105c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
105d0 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
105e0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
105f0 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
10600 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
10610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10620 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
10630 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
10640 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
10650 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
10660 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
10670 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
10680 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10690 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
106a0 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
106b0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
106c0 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
106d0 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
106e0 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
106f0 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
10700 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
10710 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
10720 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
10730 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
10740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
10750 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
10760 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
10770 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
10780 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
10790 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
107a0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
107b0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
107c0 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
107d0 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
107e0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
107f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
10800 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
10810 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
10820 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
10830 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
10840 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
10850 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
10860 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
10870 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
10880 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
10890 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
108a0 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
108b0 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
108c0 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
108d0 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
108e0 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
108f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
10900 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
10910 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
10920 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
10930 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
10940 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
10950 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
10960 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
10970 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
10980 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
10990 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
109a0 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
109b0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
109c0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
109d0 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
109e0 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
109f0 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
10a00 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
10a10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
10a20 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
10a30 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
10a40 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
10a50 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10a60 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
10a70 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10a80 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
10a90 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
10aa0 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
10ab0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
10ac0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
10ad0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
10ae0 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
10af0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b00 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
10b10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10b20 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
10b30 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b40 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
10b50 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
10b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b70 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
10b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10b90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10ba0 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
10bb0 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
10bc0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10bd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10be0 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
10bf0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
10c00 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
10c10 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
10c20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10c30 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
10c40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c50 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
10c60 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
10c70 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
10c80 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c90 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
10ca0 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
10cb0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10cc0 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
10cd0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
10ce0 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
10cf0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61   return;.      a
10d00 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
10d10 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  0 );.      p->nC
10d20 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
10d30 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
10d40 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
10d50 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
10d60 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10d70 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
10d80 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10d90 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10da0 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
10db0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10dc0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
10dd0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
10de0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
10df0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10e00 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
10e10 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
10e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
10e30 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
10e40 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
10e50 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
10e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10e80 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
10e90 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
10ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10eb0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
10ec0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
10ed0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10ee0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
10ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10f00 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10f10 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10f20 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10f30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10f40 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10f50 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10f70 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10f80 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10f90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fa0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
10fb0 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
10fc0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10fd0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
10fe0 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11000 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11010 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
11020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11030 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
11040 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
11050 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
11060 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
11070 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
11080 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
11090 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
110a0 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
110b0 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
110c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
110d0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
110e0 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
110f0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
11100 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
11110 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
11120 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
11130 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
11140 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
11150 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
11160 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
11170 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11180 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
11190 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
111a0 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
111b0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
111c0 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
111d0 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
111e0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
111f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11200 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
11210 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
11220 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
11230 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
11240 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
11250 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
11260 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
11270 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
11280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
11290 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
112a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
112b0 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
112c0 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
112d0 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
112e0 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
112f0 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
11300 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
11310 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
11320 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11330 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
11340 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
11350 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
11360 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
11370 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
11380 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
11390 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
113a0 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
113b0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
113c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
113d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
113e0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
113f0 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
11400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11410 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
11420 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11430 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
11440 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
11450 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
11460 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
11470 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
11480 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
11490 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
114a0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
114b0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
114c0 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
114d0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
114e0 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
114f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11500 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
11510 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
11520 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
11530 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
11540 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
11550 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11560 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11570 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
11580 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
11590 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
115a0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
115b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
115c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
115d0 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
115e0 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
115f0 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11600 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
11610 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
11620 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
11630 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
11640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
11650 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
11660 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
11670 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
11680 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
11690 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
116a0 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
116b0 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
116c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
116d0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
116e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
116f0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
11700 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
11710 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
11720 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
11730 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11740 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11750 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
11760 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
11770 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
11780 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
11790 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
117a0 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
117b0 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
117c0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
117d0 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
117e0 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
117f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
11800 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
11810 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
11820 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
11830 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
11840 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
11850 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
11860 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
11870 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
11880 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
11890 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
118a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
118b0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
118c0 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
118d0 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
118e0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
118f0 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
11900 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
11910 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
11920 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
11930 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
11940 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11950 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
11960 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
11970 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
11980 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
11990 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
119a0 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
119b0 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
119c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
119d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
119e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
119f0 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
11a00 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
11a10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11a20 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
11a30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
11a40 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
11a50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
11a60 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11a70 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
11a80 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
11a90 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
11aa0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
11ab0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
11ac0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
11ad0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
11ae0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
11af0 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
11b00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11b10 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
11b20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
11b30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11b40 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
11b50 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
11b60 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
11b70 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
11b80 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
11b90 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
11ba0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11bb0 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
11bc0 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
11bd0 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
11be0 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
11bf0 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
11c00 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
11c10 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
11c20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
11c30 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
11c40 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
11c50 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
11c60 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
11c70 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
11c80 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
11c90 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
11ca0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
11cb0 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
11cc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11cd0 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
11ce0 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
11cf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11d00 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
11d10 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
11d20 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
11d30 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
11d40 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
11d50 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
11d60 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
11d70 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
11d80 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
11d90 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
11da0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
11db0 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
11dc0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
11dd0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
11de0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
11df0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
11e00 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
11e10 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
11e20 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
11e30 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
11e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
11e50 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
11e60 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
11e70 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
11e80 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
11e90 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
11ea0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
11eb0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
11ec0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
11ed0 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
11ee0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11ef0 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11f00 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
11f10 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
11f20 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
11f30 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
11f40 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
11f50 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
11f60 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
11f70 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
11f80 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
11f90 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
11fa0 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
11fb0 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
11fc0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
11fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52  .  */.  if( IN_R
11fe0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
11ff0 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
12000 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53   pSelect;.    pS
12010 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  elect = 0;.  }el
12020 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65  se{.    p->pSele
12030 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
12040 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
12050 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
12060 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68  E);.  }.  p->pCh
12070 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
12080 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
12090 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
120a0 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
120b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
120c0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
120d0 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
120e0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
120f0 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
12100 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
12110 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
12120 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
12130 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
12140 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
12150 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
12160 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d  ]!=0 || sEnd.n==
12170 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  0 );.  if( sEnd.
12180 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
12190 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
121a0 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
121b0 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
121c0 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
121d0 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
121e0 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n>0 );.  z = pBe
121f0 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
12200 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
12210 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
12220 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
12230 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
12240 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
12250 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
12260 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
12270 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
12280 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
12290 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
122a0 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
122b0 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65  , 0, 0);..create
122c0 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71  _view_fail:.  sq
122d0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
122e0 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
122f0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
12300 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
12310 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c  lite3RenameExprl
12320 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  istUnmap(pParse,
12330 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20   pCNames);.  }. 
12340 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12350 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
12360 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
12370 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12380 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
12390 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
123a0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
123b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
123c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
123d0 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
123e0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
123f0 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
12400 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
12410 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
12420 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
12430 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
12440 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
12450 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
12460 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
12470 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
12480 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
12490 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
124a0 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
124b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
124c0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
124d0 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
124e0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
124f0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
12500 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
12510 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
12520 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
12530 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
12540 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
12550 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
12560 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
12570 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
12580 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
12590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
125a0 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
125b0 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
125c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
125d0 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
125e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
125f0 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
12600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12610 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
12620 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12630 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
12640 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
12650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12660 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
12670 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nt rc;.#endif.#i
12680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12690 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
126a0 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
126b0 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20  xAuth;       /* 
126c0 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e  Saved xAuth poin
126d0 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ter */.#endif.. 
126e0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
126f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
12700 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12710 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65  ABLE.  db->nSche
12720 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d  maLock++;.  rc =
12730 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
12740 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
12750 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e  pTable);.  db->n
12760 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20  SchemaLock--;.  
12770 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
12780 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
12790 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
127a0 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
127b0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
127c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
127d0 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
127e0 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
127f0 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
12800 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
12810 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
12820 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
12830 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
12840 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
12850 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
12860 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
12870 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
12880 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
12890 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
128a0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
128b0 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
128c0 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
128d0 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
128e0 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
128f0 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
12900 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
12910 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
12920 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
12930 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
12940 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
12950 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
12960 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
12970 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
12980 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
12990 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
129a0 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
129b0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
129c0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
129d0 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
129e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
129f0 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
12a00 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
12a10 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
12a20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
12a30 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
12a40 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
12a50 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
12a60 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
12a70 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
12a80 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
12a90 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
12aa0 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
12ab0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
12ac0 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
12ad0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ae0 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
12af0 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
12b00 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
12b10 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
12b20 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
12b30 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
12b40 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
12b50 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
12b60 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
12b70 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
12b80 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
12b90 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
12ba0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
12bb0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12bc0 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
12bd0 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
12be0 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
12bf0 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
12c00 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
12c10 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
12c20 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
12c30 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
12c40 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
12c50 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
12c60 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
12c70 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
12c80 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
12c90 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
12ca0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
12cb0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
12cc0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
12cd0 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
12ce0 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
12cf0 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
12d00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
12d10 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
12d20 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
12d30 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65  ( pSel ){.#ifnde
12d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
12d50 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20  TERTABLE.    u8 
12d60 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61  eParseMode = pPa
12d70 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b  rse->eParseMode;
12d80 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
12d90 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f  rseMode = PARSE_
12da0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e  MODE_NORMAL;.#en
12db0 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  dif.    n = pPar
12dc0 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
12dd0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
12de0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
12df0 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
12e00 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
12e10 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
12e20 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
12e30 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
12e40 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12e50 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
12e60 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
12e70 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
12e80 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
12e90 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
12ea0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12eb0 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
12ec0 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
12ed0 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
12ee0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
12ef0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
12f00 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
12f10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
12f20 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
12f30 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
12f40 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12f50 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
12f60 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
12f70 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
12f80 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
12f90 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
12fa0 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
12fb0 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
12fc0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
12fd0 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
12fe0 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
12ff0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
13000 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
13010 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
13020 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
13030 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
13040 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
13050 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
13060 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
13070 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
13080 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
13090 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
130a0 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
130d0 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
130e0 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
130f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13100 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
13110 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
13120 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
13130 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
13140 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
13150 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13160 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
13170 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
13180 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
13190 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
131a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
131b0 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
131c0 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
131d0 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
131e0 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
131f0 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
13200 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
13210 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
13220 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
13230 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13240 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
13250 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13260 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
13270 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
13280 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13290 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
132a0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
132b0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
132c0 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
132d0 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
132e0 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
132f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13300 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
13310 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
13320 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
13330 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
13340 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
13350 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
13360 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
13370 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
13380 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
13390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
133a0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
133b0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
133c0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
133d0 2d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  -;.#ifndef SQLIT
133e0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
133f0 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50  E.    pParse->eP
13400 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73  arseMode = ePars
13410 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  eMode;.#endif.  
13420 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
13430 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  r++;.  }.  pTabl
13440 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
13450 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
13460 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66  resetViews;.  if
13470 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13480 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
13490 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
134a0 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
134b0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
134c0 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65   = 0;.    pTable
134d0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->nCol = 0;.  }.
134e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
134f0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
13500 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
13510 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13520 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13530 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
13540 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13550 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
13560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13570 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
13580 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
13590 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
135a0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
135b0 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
135c0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
135d0 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
135e0 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
135f0 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
13600 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13610 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13620 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
13630 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
13640 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
13650 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
13660 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
13670 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
13680 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
13690 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
136a0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
136b0 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
136c0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
136d0 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
136e0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
136f0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
13700 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
13710 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
13720 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
13730 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
13740 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
13750 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
13760 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
13770 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
13780 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
13790 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
137a0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
137b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
137c0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
137d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
137e0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
137f0 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
13800 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
13810 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
13820 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
13830 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
13840 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
13850 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
13860 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
13870 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
13880 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
13890 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
138a0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
138b0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
138c0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
138d0 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
138e0 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
138f0 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
13900 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
13910 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
13920 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
13930 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
13940 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
13950 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
13960 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
13970 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
13980 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
13990 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
139a0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
139b0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
139c0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
139d0 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
139e0 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
139f0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
13a00 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
13a10 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
13a20 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13a30 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
13a40 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
13a50 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
13a60 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
13a70 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
13a80 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
13a90 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
13aa0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
13ab0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
13ac0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
13ad0 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
13ae0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
13af0 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
13b00 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
13b10 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
13b20 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
13b30 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
13b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
13b60 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
13b70 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
13b80 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13b90 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
13ba0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
13bb0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
13bc0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
13bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13be0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13bf0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
13c00 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
13c10 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
13c20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
13c30 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
13c40 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
13c50 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
13c60 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
13c70 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
13c80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
13c90 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
13ca0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
13cb0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
13cc0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
13cd0 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
13ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
13cf0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
13d00 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
13d10 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
13d20 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
13d30 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
13d40 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
13d50 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
13d60 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
13d70 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
13d80 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
13d90 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
13da0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
13db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13dc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
13dd0 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
13de0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
13df0 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
13e00 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
13e10 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
13e20 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
13e30 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13e40 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
13e50 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
13e60 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
13e70 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
13e80 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
13e90 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
13ea0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
13eb0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
13ec0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
13ed0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13ee0 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
13ef0 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
13f00 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
13f10 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
13f20 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
13f30 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13f40 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13f50 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
13f60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13f70 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  );.  if( iTable<
13f80 32 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  2 ) sqlite3Error
13f90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
13fa0 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20  rupt schema");. 
13fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13fc0 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
13fd0 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
13fe0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
13ff0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
14000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14010 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14020 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
14030 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
14040 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
14050 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
14060 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
14070 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
14080 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
14090 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
140a0 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
140b0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
140c0 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
140d0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
140e0 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
140f0 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
14100 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
14110 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
14120 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
14130 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
14140 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
14150 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
14160 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
14170 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
14180 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
14190 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
141a0 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
141b0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
141c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
141d0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
141e0 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
141f0 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
14200 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
14210 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
14220 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
14230 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14240 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
14250 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  ME, iTable, r1, 
14260 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
14270 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14280 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
14290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
142a0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
142b0 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
142c0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
142d0 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
142e0 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
142f0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
14300 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
14310 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
14320 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
14330 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
14340 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
14350 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
14360 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
14370 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
14380 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
14390 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
143a0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
143b0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
143c0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
143d0 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
143e0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
143f0 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  ab){.  /* If the
14400 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
14410 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
14420 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
14430 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14440 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
14450 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
14460 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
14470 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
14480 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
14490 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
144a0 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
144b0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
144c0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
144d0 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
144e0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
144f0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
14500 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
14510 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
14520 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
14530 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
14540 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
14550 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
14560 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
14570 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
14580 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
14590 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
145a0 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
145b0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
145c0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
145d0 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
145e0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
145f0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
14600 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
14610 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
14620 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
14630 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
14640 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
14650 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
14660 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
14670 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
14680 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
14690 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
146a0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
146b0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
146c0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
146d0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
146e0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
146f0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
14700 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
14710 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
14720 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
14730 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
14740 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
14750 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
14760 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14770 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
14780 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
14790 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
147a0 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
147b0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
147c0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
147d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
147e0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
147f0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
14800 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
14810 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
14820 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
14830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14840 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
14850 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
14860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14870 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
14880 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14890 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
148a0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
148b0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
148c0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
148d0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
148e0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
148f0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
14900 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
14910 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
14920 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
14930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
14940 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
14950 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
14960 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
14970 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
14980 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
14990 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
149a0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
149b0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
149c0 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
149d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
149e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
149f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14a00 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
14a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14a20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
14a30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14a40 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
14a50 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
14a60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14a70 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
14a80 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
14a90 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
14aa0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
14ab0 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
14ac0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
14ad0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  zDbSName;.  for(
14ae0 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
14af0 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
14b00 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
14b10 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
14b20 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
14b30 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
14b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
14b50 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
14b60 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
14b70 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
14b80 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14b90 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
14ba0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14bb0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
14bc0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
14bd0 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
14be0 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
14bf0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14c10 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
14c20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
14c30 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
14c40 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
14c50 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
14c60 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
14c70 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
14c80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14c90 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
14ca0 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
14cb0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
14cc0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
14cd0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14ce0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
14cf0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
14d00 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14d10 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14d20 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
14d30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14d40 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
14d50 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d70 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
14d80 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
14d90 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
14da0 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
14db0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
14dc0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
14dd0 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
14de0 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
14df0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
14e00 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
14e10 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
14e20 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
14e30 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
14e40 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
14e50 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
14e60 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
14e70 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
14e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
14e90 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
14ea0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
14eb0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
14ec0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
14ed0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
14ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
14ef0 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
14f00 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
14f10 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
14f20 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
14f30 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14f40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
14f50 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
14f60 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
14f70 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
14f80 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
14f90 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
14fa0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
14fb0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
14fc0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
14fd0 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
14fe0 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
14ff0 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
15000 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
15010 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
15020 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
15030 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15040 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
15050 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
15060 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
15070 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
15080 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
15090 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
150a0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
150b0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
150c0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
150d0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
150e0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
150f0 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
15100 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15110 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
15120 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
15130 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
15140 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
15150 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
15160 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
15170 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
15180 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
15190 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
151a0 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
151b0 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
151c0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
151d0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
151e0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
151f0 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
15200 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
15210 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
15220 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
15230 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
15240 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
15250 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15260 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
15270 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
15280 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
15290 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
152a0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
152b0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
152c0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
152d0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
152e0 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
152f0 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
15300 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b->zDbSName, MAS
15310 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e  TER_NAME, pTab->
15320 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
15330 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
15340 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15350 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
15360 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
15370 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
15380 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
15390 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
153a0 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
153b0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
153c0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
153d0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
153e0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
153f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15400 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
15410 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
15420 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
15430 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
15440 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
15450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15460 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
15470 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
15480 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
15490 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
154a0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
154b0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
154c0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
154d0 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
154e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
154f0 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
15500 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
15510 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
15520 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
15530 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
15540 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
15550 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
15560 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
15570 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
15580 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
15590 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
155a0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
155b0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
155c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
155d0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
155e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
155f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15600 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15610 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
15620 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
15630 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15640 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
15650 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
15660 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
15670 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
15680 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
15690 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
156a0 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73  ressErr++;.  ass
156b0 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c  ert( isView==0 |
156c0 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45  | isView==LOCATE
156d0 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20  _VIEW );.  pTab 
156e0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
156f0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
15700 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
15710 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
15720 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
15730 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
15740 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
15750 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
15760 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
15770 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
15780 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
15790 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
157a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
157b0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
157c0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
157d0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
157e0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
157f0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
15800 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
15810 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
15820 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
15830 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
15840 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
15850 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
15860 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
15870 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
15880 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
15890 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
158a0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
158b0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
158c0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
158d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
158e0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
158f0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
15900 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
15910 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
15920 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
15930 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
15940 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
15950 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
15960 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
15970 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
15980 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15990 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
159a0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
159b0 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
159c0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
159d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
159e0 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
159f0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
15a00 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
15a10 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
15a20 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
15a30 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
15a40 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
15a50 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
15a60 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
15a70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15a80 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
15a90 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
15aa0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
15ab0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
15ac0 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
15ad0 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
15ae0 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
15af0 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
15b00 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
15b10 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
15b20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
15b30 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
15b40 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
15b50 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
15b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15b70 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
15b80 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
15b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15ba0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15bb0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
15bc0 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
15bd0 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
15be0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15bf0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
15c00 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
15c10 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15c20 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
15c30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
15c40 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15c50 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15c60 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
15c70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
15c80 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15c90 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15ca0 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
15cb0 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
15cc0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
15cd0 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
15ce0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
15cf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15d00 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
15d10 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
15d20 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
15d30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15d40 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d60 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
15d70 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
15d80 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
15d90 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
15da0 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
15db0 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
15dc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
15dd0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
15de0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
15df0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15e00 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
15e10 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
15e20 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
15e30 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
15e40 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15e50 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
15e60 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
15e70 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
15e80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15e90 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
15ea0 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
15eb0 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
15ec0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
15ed0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15ee0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
15ef0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15f00 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
15f10 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
15f20 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
15f30 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
15f40 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15f50 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15f60 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
15f70 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
15f80 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
15f90 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
15fa0 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
15fb0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
15fc0 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
15fd0 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
15fe0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
15ff0 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c  qlite3FkDropTabl
16000 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c  e(pParse, pName,
16010 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
16020 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
16030 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
16040 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
16050 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
16060 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
16070 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
16080 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
16090 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
160a0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
160b0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
160c0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
160d0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
160e0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
160f0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
16100 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
16110 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
16120 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
16130 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
16140 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
16150 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
16160 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
16170 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
16180 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
16190 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
161a0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
161b0 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
161c0 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
161d0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
161e0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
161f0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
16200 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
16210 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
16220 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
16230 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
16240 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
16250 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
16260 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
16270 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
16280 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
16290 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
162a0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
162b0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
162c0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
162d0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
162e0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
162f0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
16300 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
16310 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
16320 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
16330 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
16340 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
16350 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
16360 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
16370 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
16380 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
16390 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
163a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
163b0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
163c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
163d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
163e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
163f0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
16400 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
16410 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
16420 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
16430 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
16440 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
16450 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16460 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
16470 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
16480 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
16490 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
164a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
164b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
164c0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
164d0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
164e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
164f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16500 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
16510 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
16520 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
16530 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
16540 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
16550 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
16560 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
16570 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
16580 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
16590 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
165a0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
165b0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
165c0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
165d0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
165e0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
165f0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
16600 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
16610 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
16620 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
16630 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
16640 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
16650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
16670 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
16680 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
16690 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
166a0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
166b0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
166c0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
166d0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
166e0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
166f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
16700 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
16710 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
16720 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
16730 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
16740 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16750 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
16760 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
16770 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
16780 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
16790 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
167a0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
167b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
167c0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
167d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
167e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
167f0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
16800 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
16810 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
16820 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
16830 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
16840 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
16850 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
16860 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
16870 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
16880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
16890 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
168a0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
168b0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
168c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
168d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
168e0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
168f0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
16900 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
16910 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
16920 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
16930 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
16940 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
16950 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
16960 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
16970 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
16980 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
16990 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73  _OBJECT ){.    s
169a0 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
169b0 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
169c0 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d  id*)z, pTo);.  }
169d0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
169e0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
169f0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
16a00 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
16a10 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
16a20 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
16a30 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
16a40 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
16a50 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16a60 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
16a70 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
16a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
16a90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
16aa0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
16ab0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
16ac0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
16ad0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
16ae0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
16af0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
16b00 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
16b10 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
16b20 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
16b30 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
16b40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16b60 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
16b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
16b80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
16b90 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
16ba0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
16bb0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
16bc0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
16bd0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
16be0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
16bf0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
16c00 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
16c10 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
16c20 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
16c30 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
16c40 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
16c50 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69  , &pFKey->aCol[i
16c60 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  ], pFromCol->a[i
16c70 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
16c80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
16c90 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
16ca0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
16cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
16cc0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
16cd0 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
16ce0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
16cf0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
16d00 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69  Col = z;.      i
16d10 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
16d20 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
16d30 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
16d40 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a  nRemap(pParse, z
16d50 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
16d60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
16d70 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
16d80 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16d90 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
16da0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
16db0 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
16dc0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
16dd0 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
16de0 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
16df0 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
16e00 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
16e10 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
16e20 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
16e30 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
16e40 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
16e50 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
16e60 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
16e70 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
16e80 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
16e90 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53  eld(db, 0, p->pS
16ea0 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78  chema) );.  pNex
16eb0 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71  tTo = (FKey *)sq
16ec0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
16ed0 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65  &p->pSchema->fke
16ee0 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46  yHash, .      pF
16ef0 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20  Key->zTo, (void 
16f00 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69  *)pFKey.  );.  i
16f10 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65  f( pNextTo==pFKe
16f20 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
16f30 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
16f40 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
16f50 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f   }.  if( pNextTo
16f60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16f70 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
16f80 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79  ==0 );.    pFKey
16f90 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78  ->pNextTo = pNex
16fa0 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f  tTo;.    pNextTo
16fb0 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65  ->pPrevTo = pFKe
16fc0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  y;.  }..  /* Lin
16fd0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
16fe0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
16ff0 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
17000 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
17010 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
17020 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
17030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17040 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
17050 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
17060 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
17070 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
17080 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
17090 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
170a0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
170b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
170c0 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
170d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
170e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
170f0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
17100 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
17110 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
17120 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
17130 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
17140 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
17150 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
17160 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17170 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
17180 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
17190 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
171a0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
171b0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
171c0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
171d0 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
171e0 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
171f0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
17200 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
17210 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
17220 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
17230 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
17240 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17250 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
17260 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
17270 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
17280 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
17290 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
172a0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
172b0 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
172c0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
172d0 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
172e0 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20  sDeferred==1 ); 
172f0 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32  /* EV: R-30323-2
17300 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  1917 */.  pFKey-
17310 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75  >isDeferred = (u
17320 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  8)isDeferred;.#e
17330 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
17340 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
17350 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
17360 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
17370 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
17380 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
17390 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
173a0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
173b0 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
173c0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
173d0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
173e0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
173f0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
17400 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
17410 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
17420 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
17430 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
17440 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
17450 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
17460 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
17470 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
17480 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
17490 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
174a0 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
174b0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
174c0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
174d0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
174e0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
174f0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
17500 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
17510 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
17520 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
17530 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
17540 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
17550 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
17560 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
17570 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
17580 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
17590 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
175a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
175b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
175c0 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
175d0 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
175e0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
175f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
17600 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
17610 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
17620 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
17630 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
17640 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
17650 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
17660 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  x */.  int iSort
17670 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
17680 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17690 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f  opened by OpenSo
176a0 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29  rter (if in use)
176b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
176e0 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
176f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20  /.  int addr2;  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f     /* Address to
17720 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78   jump to for nex
17730 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
17740 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17770 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
17780 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20  PartIdxLabel;   
17790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
177a0 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20  p to this label 
177b0 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f  to skip a row */
177c0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
177f0 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
17800 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
17810 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
17840 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
17850 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
17860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
17870 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
17880 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65  sembled index re
17890 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
178a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
178b0 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
178c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
178d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
178e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
178f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
17900 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
17910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17920 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
17930 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
17940 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17950 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
17960 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
17970 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
17980 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20  iDb].zDbSName ) 
17990 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
179a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
179b0 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
179c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
179d0 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
179e0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
179f0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
17a00 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
17a10 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
17a20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
17a30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
17a40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
17a50 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
17a60 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
17a70 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
17a80 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
17a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
17aa0 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
17ab0 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
17ac0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
17ad0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
17ae0 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dex);.  assert( 
17af0 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  pKey!=0 || db->m
17b00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
17b10 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a  Parse->nErr );..
17b20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f    /* Open the so
17b30 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77  rter cursor if w
17b40 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65  e are to use one
17b50 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d  . */.  iSorter =
17b60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17b70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17b80 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
17b90 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20  rOpen, iSorter, 
17ba0 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  0, pIndex->nKeyC
17bb0 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20  ol, (char*).    
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
17be0 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49  f(pKey), P4_KEYI
17bf0 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
17c00 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
17c10 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
17c20 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
17c30 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
17c40 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
17c50 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
17c60 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
17c70 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
17c80 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
17c90 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
17ca0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
17cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
17cc0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56  ind, iTab, 0); V
17cd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17ce0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
17cf0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17d00 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
17d10 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61  e3MultiWrite(pPa
17d20 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
17d30 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
17d40 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
17d50 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
17d60 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
17d70 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
17d80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
17d90 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
17da0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
17db0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
17dc0 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
17dd0 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
17de0 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
17df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17e00 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
17e10 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
17e20 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
17e30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17e40 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
17e50 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
17e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17e70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
17e80 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
17e90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17ea0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
17eb0 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
17ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ed0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
17ee0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
17ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17f00 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
17f10 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
17f20 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
17f30 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
17f40 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
17f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f60 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
17f70 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
17f80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
17f90 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
17fa0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e  Index) ){.    in
17fb0 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
17fc0 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20  beGoto(v, 1);.  
17fd0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
17fe0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17ff0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
18000 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
18010 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29  ble(v, OE_Abort)
18020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18030 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18040 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20  _SorterCompare, 
18050 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67  iSorter, j2, reg
18060 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20  Record,.        
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
18090 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
180a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55  v);.    sqlite3U
180b0 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
180c0 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
180d0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  , pIndex);.    s
180e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
180f0 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c  re(v, j2);.  }el
18100 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  se{.    addr2 = 
18110 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
18120 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20  ntAddr(v);.  }. 
18130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18140 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
18150 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ata, iSorter, re
18160 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a  gRecord, iIdx);.
18170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18180 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e  Op1(v, OP_SeekEn
18190 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
181a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
181b0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
181c0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
181d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
181e0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
181f0 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
18200 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18210 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18220 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
18230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18240 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
18250 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72  t, iSorter, addr
18260 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
18270 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
18280 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
18290 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  dr1);..  sqlite3
182a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
182b0 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
182c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182d0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
182e0 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
182f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18300 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29  _Close, iSorter)
18310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
18320 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74  ate heap space t
18330 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20  o hold an Index 
18340 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c  object with nCol
18350 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
18360 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  Increase the all
18370 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20  ocation size to 
18380 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61  provide an extra
18390 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
183a0 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
183b0 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ed space after t
183c0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
183d0 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20  and return a.** 
183e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
183f0 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a  extra space in *
18400 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65  ppExtra..*/.Inde
18410 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61  x *sqlite3Alloca
18420 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20  teIndexObject(. 
18430 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
18440 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18450 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
18460 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20    i16 nCol,     
18470 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
18480 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
18490 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
184a0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
184b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
184c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65  er of bytes of e
184d0 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c  xtra space to al
184e0 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  loc */.  char **
184f0 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a  ppExtra       /*
18500 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
18510 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f  "extra" space */
18520 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20  .){.  Index *p; 
18530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
18540 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62  located index ob
18550 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ject */.  int nB
18560 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  yte;           /
18570 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
18580 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63   for Index objec
18590 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20  t + arrays */.. 
185a0 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
185b0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b  sizeof(Index)) +
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185d0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
185e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
185f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
18600 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20  r*)*nCol) +     
18610 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
18620 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
18630 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
18640 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
18650 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64  +1) +     /* Ind
18660 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20  ex.aiRowLogEst  
18670 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
18680 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29       sizeof(i16)
18690 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
186a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
186b0 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20  lumn   */.      
186c0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
186d0 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20  f(u8)*nCol);    
186e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
186f0 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
18700 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
18710 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
18720 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  yte + nExtra);. 
18730 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68   if( p ){.    ch
18740 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63  ar *pExtra = ((c
18750 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73  har*)p)+ROUND8(s
18760 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
18770 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28     p->azColl = (
18780 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78  const char**)pEx
18790 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52  tra; pExtra += R
187a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
187b0 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70  r*)*nCol);.    p
187c0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20  ->aiRowLogEst = 
187d0 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b  (LogEst*)pExtra;
187e0 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   pExtra += sizeo
187f0 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
18800 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c  1);.    p->aiCol
18810 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74  umn = (i16*)pExt
18820 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
18830 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
18840 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f  nCol;.    p->aSo
18850 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70  rtOrder = (u8*)p
18860 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43  Extra;.    p->nC
18870 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20  olumn = nCol;.  
18880 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e    p->nKeyCol = n
18890 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70  Col - 1;.    *pp
188a0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
188b0 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  p) + nByte;.  }.
188c0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
188d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
188e0 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
188f0 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
18900 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
18910 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
18920 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
18930 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
18940 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
18950 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
18960 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
18970 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
18980 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
18990 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
189a0 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
189b0 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
189c0 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
189d0 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
189e0 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
189f0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
18a00 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
18a10 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
18a20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18a30 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
18a40 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
18a50 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
18a60 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
18a70 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
18a80 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
18a90 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
18aa0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
18ab0 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
18ac0 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
18ad0 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
18ae0 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
18af0 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
18b00 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
18b10 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
18b20 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
18b30 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18b40 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
18b50 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
18b60 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
18b70 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
18b80 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
18b90 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
18ba0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
18bb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
18bc0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
18bd0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
18be0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
18bf0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
18c00 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
18c10 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
18c20 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
18c30 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
18c40 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
18c50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
18c60 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
18c70 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
18c80 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
18c90 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
18ca0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
18cb0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
18cc0 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
18cd0 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
18ce0 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
18cf0 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
18d00 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
18d10 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
18d20 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
18d30 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72  .  Expr *pPIWher
18d40 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63  e,    /* WHERE c
18d50 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61  lause for partia
18d60 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
18d70 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
18d80 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
18d90 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
18da0 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
18db0 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
18dc0 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist,    /* Omit 
18dd0 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
18de0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
18df0 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20 20  .  u8 idxType   
18e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
18e10 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  ex type */.){.  
18e20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
18e30 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18e40 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
18e50 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
18e60 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
18e70 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
18e80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
18e90 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
18ea0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
18eb0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
18ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18ed0 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
18ee0 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
18ef0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69  int i, j;.  DbFi
18f00 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
18f10 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
18f20 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
18f30 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
18f40 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
18f50 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
18f60 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
18f70 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
18f80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18f90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18fa0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
18fb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
18fc0 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
18fd0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
18fe0 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
18ff0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
19000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19010 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
19020 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
19030 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
19040 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
19050 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
19060 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
19070 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
19080 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
19090 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
190a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
190b0 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
190c0 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
190f0 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20  ed for zExtra[] 
19100 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43  */.  int nExtraC
19110 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
19120 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19130 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  of extra columns
19140 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61   needed */.  cha
19150 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20  r *zExtra = 0;  
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19170 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74   Extra space aft
19180 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
19190 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ect */.  Index *
191a0 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  pPk = 0;      /*
191b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
191c0 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ex for WITHOUT R
191d0 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a  OWID tables */..
191e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
191f0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
19200 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
19210 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19220 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
19230 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  ( IN_DECLARE_VTA
19240 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53 51  B && idxType!=SQ
19250 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
19260 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67  MARYKEY ){.    g
19270 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19280 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
19290 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
192a0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
192b0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
192c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
192d0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
192e0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
192f0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
19300 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
19310 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
19320 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
19330 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
19340 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
19350 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
19360 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
19370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
19380 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
19390 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
193a0 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
193b0 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
193c0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
193d0 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
193e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
193f0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
19400 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
19410 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
19420 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
19430 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
19440 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
19450 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
19460 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19470 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
19480 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
19490 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
194a0 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
194b0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
194c0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
194d0 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
194e0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
194f0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
19500 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
19510 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
19520 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
19530 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
19540 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
19550 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
19560 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
19570 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
19580 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
19590 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
195a0 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
195b0 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
195c0 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
195d0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
195e0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
195f0 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
19600 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
19610 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
19620 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
19630 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
19640 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
19650 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  me);.    if( sql
19660 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
19670 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20  sFix, pTblName) 
19680 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
19690 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
196a0 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
196b0 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
196c0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
196d0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
196e0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
196f0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
19700 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
19710 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
19720 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
19730 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
19740 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
19750 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
19760 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
19770 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
19780 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
19790 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
197a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
197b0 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
197c0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
197d0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
197e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
197f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19800 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
19810 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
19820 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
19830 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
19840 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
19850 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19860 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19870 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19880 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
19890 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20  d(pTab) ) pPk = 
198a0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
198b0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
198c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
198d0 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
198e0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
198f0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  t==0 );.    pTab
19900 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
19910 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
19920 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
19930 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19940 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
19950 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
19960 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
19970 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
19980 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
19990 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
199a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
199b0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
199c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
199d0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
199e0 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
199f0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62  =0 .       && db
19a00 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23  ->init.busy==0.#
19a10 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
19a20 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
19a30 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55       && sqlite3U
19a40 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61  serAuthTable(pTa
19a50 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e  b->zName)==0.#en
19a60 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
19a70 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d  E_ALLOW_SQLITE_M
19a80 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20  ASTER_INDEX.    
19a90 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
19aa0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
19ab0 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d  e[7],"master")!=
19ac0 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  0.#endif.       
19ad0 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
19ae0 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
19af0 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39  7],"altertab_",9
19b00 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71 6c  )!=0. ){.    sql
19b10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19b20 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
19b30 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
19b40 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
19b50 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
19b60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19b70 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19b80 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
19b90 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
19ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
19bb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
19bc0 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
19bd0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
19be0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19bf0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
19c00 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
19c10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19c20 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
19c30 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
19c40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19c50 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
19c60 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
19c70 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
19c80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19c90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
19ca0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
19cb0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
19cc0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
19cd0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
19ce0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
19cf0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
19d00 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
19d10 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
19d20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
19d30 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
19d40 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
19d50 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
19d60 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
19d70 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
19d80 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
19d90 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
19da0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
19db0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
19dc0 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
19dd0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
19de0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
19df0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
19e00 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
19e10 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
19e20 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
19e30 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
19e40 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
19e50 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
19e60 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
19e70 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
19e80 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
19e90 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
19ea0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
19eb0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
19ec0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
19ed0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
19ee0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
19ef0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
19f00 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
19f10 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
19f20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19f30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
19f40 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
19f50 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
19f60 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
19f70 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
19f80 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
19f90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19fa0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19fb0 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f   if( !IN_RENAME_
19fc0 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
19fd0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
19fe0 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  sy ){.        if
19ff0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
1a000 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
1a010 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1a020 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a030 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
1a040 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
1a050 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
1a060 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1a070 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  _index;.        
1a090 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a0a0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
1a0b0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
1a0c0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d  pDb->zDbSName)!=
1a0d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1a0e0 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
1a0f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a100 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a110 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
1a120 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
1a130 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  me);.        }el
1a140 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1a150 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
1a160 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
1a170 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1a180 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1a190 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1a1a0 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
1a1b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1a1e0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
1a1f0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
1a200 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
1a210 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
1a220 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
1a230 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
1a240 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
1a250 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
1a260 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
1a270 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
1a280 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
1a290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
1a2a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a2b0 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dex;.    }..    
1a2c0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
1a2d0 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74  ex names generat
1a2e0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73  ed from within s
1a2f0 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
1a300 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73  tab().    ** mus
1a310 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61  t have names tha
1a320 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66  t are distinct f
1a330 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d  rom normal autom
1a340 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73  atic index names
1a350 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ..    ** The fol
1a360 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
1a370 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74   converts "sqlit
1a380 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_autoindex..."
1a390 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71   into.    ** "sq
1a3a0 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e  lite3_butoindex.
1a3b0 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .." in order to 
1a3c0 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64  make the names d
1a3d0 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20  istinct..    ** 
1a3e0 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65  The "vtab_err.te
1a3f0 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74  st" test demonst
1a400 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f  rates the need o
1a410 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  f this statement
1a420 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f  . */.    if( IN_
1a430 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 20  SPECIAL_PARSE ) 
1a440 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a  zName[7]++;.  }.
1a450 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1a460 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
1a470 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
1a480 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
1a490 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1a4a0 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 21  RIZATION.  if( !
1a4b0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1a4c0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1a4d0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
1a4e0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
1a4f0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a500 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a510 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
1a520 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a  TABLE(iDb), 0, z
1a530 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1a540 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a550 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1a560 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
1a570 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1a580 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1a590 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c  iDb==1 ) i = SQL
1a5a0 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
1a5b0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1a5c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1a5d0 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
1a5e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1a5f0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1a600 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a610 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1a620 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
1a630 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
1a640 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1a650 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
1a660 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
1a670 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
1a680 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
1a690 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
1a6a0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a6b0 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
1a6c0 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
1a6d0 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
1a6e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
1a6f0 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ==0 ){.    Token
1a700 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f   prevCol;.    Co
1a710 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54  lumn *pCol = &pT
1a720 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
1a730 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c  Col-1];.    pCol
1a740 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
1a750 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20  LFLAG_UNIQUE;.  
1a760 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
1a770 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f  it(&prevCol, pCo
1a780 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  l->zName);.    p
1a790 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
1a7a0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1a7b0 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
1a7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a7d0 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
1a7e0 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b  , &prevCol, 0));
1a7f0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1a800 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1a810 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a820 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
1a830 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73  Expr==1 );.    s
1a840 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
1a850 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74  tSortOrder(pList
1a860 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  , sortOrder);.  
1a870 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1a880 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
1a890 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c  ength(pParse, pL
1a8a0 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20  ist, "index");. 
1a8b0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
1a8c0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
1a8d0 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
1a8e0 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
1a8f0 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
1a900 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
1a910 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1a920 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
1a930 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1a940 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a950 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
1a960 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
1a970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
1a980 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pr!=0 );.    if(
1a990 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1a9a0 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20  OLLATE ){.      
1a9b0 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
1a9c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
1a9d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29  Expr->u.zToken))
1a9e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a9f0 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
1aa00 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
1aa10 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
1aa20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1aa30 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
1aa40 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20  nExtraCol = pPk 
1aa50 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a  ? pPk->nKeyCol :
1aa60 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   1;.  pIndex = s
1aa70 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
1aa80 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c  dexObject(db, pL
1aa90 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78  ist->nExpr + nEx
1aaa0 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  traCol,.        
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e                nN
1aad0 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31  ame + nExtra + 1
1aae0 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66  , &zExtra);.  if
1aaf0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ab00 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
1ab10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ab20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ab30 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1ab40 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
1ab50 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61  owLogEst) );.  a
1ab60 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1ab70 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
1ab80 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
1ab90 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
1aba0 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72   zExtra;.  zExtr
1abb0 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  a += nName + 1;.
1abc0 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
1abd0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
1abe0 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
1abf0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
1ac00 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
1ac10 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
1ac20 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
1ac30 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
1ac40 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70  or!=OE_None;.  p
1ac50 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d  Index->idxType =
1ac60 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64   idxType;.  pInd
1ac70 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
1ac80 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1ac90 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b  ma;.  pIndex->nK
1aca0 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e  eyCol = pList->n
1acb0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57  Expr;.  if( pPIW
1acc0 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
1acd0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
1ace0 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
1acf0 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78  pTab, NC_PartIdx
1ad00 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a  , pPIWhere, 0);.
1ad10 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72      pIndex->pPar
1ad20 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57  tIdxWhere = pPIW
1ad30 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65  here;.    pPIWhe
1ad40 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  re = 0;.  }.  as
1ad50 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1ad60 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1ad70 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f   iDb, 0) );..  /
1ad80 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ad90 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f  f we should hono
1ada0 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20  r DESC requests 
1adb0 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  on index columns
1adc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d  .  */.  if( pDb-
1add0 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
1ade0 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
1adf0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
1ae00 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44  -1;   /* Honor D
1ae10 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ESC */.  }else{.
1ae20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
1ae30 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e  k = 0;    /* Ign
1ae40 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a  ore DESC */.  }.
1ae50 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68  .  /* Analyze th
1ae60 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
1ae70 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  sions that form 
1ae80 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1ae90 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20   index and.  ** 
1aea0 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72  report any error
1aeb0 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f  s.  In the commo
1aec0 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
1aed0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
1aee0 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61  xactly.  ** a ta
1aef0 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72  ble column, stor
1af00 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e  e that column in
1af10 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f   aiColumn[].  Fo
1af20 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73  r general expres
1af30 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75  sions,.  ** popu
1af40 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f  late pIndex->aCo
1af50 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  lExpr and store 
1af60 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20  XN_EXPR (-2) in 
1af70 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a  aiColumn[]..  **
1af80 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1af90 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1afa0 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  wo or more colum
1afb0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
1afc0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20  are identical.. 
1afd0 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20   ** TODO: Issue 
1afe0 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65  a warning if the
1aff0 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b   table primary k
1b000 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ey is used as pa
1b010 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69  rt of the.  ** i
1b020 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20  ndex key..  */. 
1b030 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c 69   pListItem = pLi
1b040 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f  st->a;.  if( IN_
1b050 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1b060 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f  .    pIndex->aCo
1b070 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20  lExpr = pList;. 
1b080 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
1b090 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1b0a0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
1b0b0 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
1b0c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  ){.    Expr *pCE
1b0d0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
1b0e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
1b0f0 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  h index expressi
1b100 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  on */.    int re
1b110 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1b120 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20  ;        /* ASC 
1b130 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69  or DESC on the i
1b140 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
1b150 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
1b160 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
1b170 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
1b180 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
1b190 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  */..    sqlite3S
1b1a0 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49  tringToId(pListI
1b1b0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1b1c0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
1b1d0 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
1b1e0 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64  rse, pTab, NC_Id
1b1f0 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d  xExpr, pListItem
1b200 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->pExpr, 0);.   
1b210 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1b220 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
1b230 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b240 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
1b250 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1b260 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1b270 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70  );.    if( pCExp
1b280 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
1b290 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
1b2a0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1b2b0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
1b2c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b2d0 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73  (pParse, "expres
1b2e0 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
1b2f0 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
1b300 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  and ".          
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f        "UNIQUE co
1b330 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
1b340 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b350 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b360 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b370 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d  Index->aColExpr=
1b380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1b390 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
1b3a0 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
1b3b0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
1b3c0 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f   }.      j = XN_
1b3d0 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
1b3e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1b3f0 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1b400 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1b410 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Null = 0;.    }e
1b420 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  lse{.      j = p
1b430 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  CExpr->iColumn;.
1b440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
1b450 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20  =0x7fff );.     
1b460 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
1b470 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50      j = pTab->iP
1b480 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
1b490 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
1b4a0 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  j].notNull==0 ){
1b4b0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1b4c0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
1b4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b4e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b4f0 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20  [i] = (i16)j;.  
1b500 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20    }.    zColl = 
1b510 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  0;.    if( pList
1b520 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Item->pExpr->op=
1b530 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
1b540 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
1b550 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
1b560 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
1b570 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1b580 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
1b590 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
1b5a0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1b5b0 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
1b5c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1b5d0 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
1b5e0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
1b5f0 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
1b600 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
1b610 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
1b620 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
1b630 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b  else if( j>=0 ){
1b640 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1b650 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1b660 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
1b670 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c  ( !zColl ) zColl
1b680 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1b690 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ARY;.    if( !db
1b6a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
1b6b0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
1b6c0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
1b6d0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
1b6e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b6f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
1b700 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1b710 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
1b720 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1b730 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
1b740 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
1b750 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
1b760 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1b770 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
1b780 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
1b790 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1b7a0 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74  e table key to t
1b7b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1b7c0 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55  dex.  For WITHOU
1b7d0 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62  T ROWID.  ** tab
1b7e0 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30  les (when pPk!=0
1b7f0 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1b800 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d  he declared PRIM
1b810 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20  ARY KEY.  For.  
1b820 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73  ** normal tables
1b830 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74   (when pPk==0) t
1b840 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1b850 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  rowid..  */.  if
1b860 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72  ( pPk ){.    for
1b870 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
1b880 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
1b890 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61    int x = pPk->a
1b8a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1b8b0 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
1b8c0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  ;.      if( hasC
1b8d0 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69  olumn(pIndex->ai
1b8e0 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e  Column, pIndex->
1b8f0 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20  nKeyCol, x) ){. 
1b900 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
1b910 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20  Column--; .     
1b920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b930 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b940 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  [i] = x;.       
1b950 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b960 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  i] = pPk->azColl
1b970 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  [j];.        pIn
1b980 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1b990 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f  i] = pPk->aSortO
1b9a0 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
1b9b0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
1b9c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1b9d0 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  i==pIndex->nColu
1b9e0 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mn );.  }else{. 
1b9f0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1ba00 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[i] = XN_ROWI
1ba10 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  D;.    pIndex->a
1ba20 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  zColl[i] = sqlit
1ba30 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1ba40 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
1ba50 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
1ba60 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
1ba70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73  NewTable==0 ) es
1ba80 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
1ba90 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20  (pIndex);..  /* 
1baa0 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f  If this index co
1bab0 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c  ntains every col
1bac0 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65  umn of its table
1bad0 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a  , then mark.  **
1bae0 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e   it as a coverin
1baf0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73  g index */.  ass
1bb00 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54  ert( HasRowid(pT
1bb10 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54  ab) .      || pT
1bb20 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73  ab->iPKey<0 || s
1bb30 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1bb40 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62  dex(pIndex, pTab
1bb50 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20  ->iPKey)>=0 );. 
1bb60 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
1bb70 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64  sNotIndexed(pInd
1bb80 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e  ex);.  if( pTblN
1bb90 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78  ame!=0 && pIndex
1bba0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d  ->nColumn>=pTab-
1bbb0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e  >nCol ){.    pIn
1bbc0 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1bbd0 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 1;.    for(j=0
1bbe0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1bbf0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1bc00 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
1bc10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bc20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75   if( sqlite3Colu
1bc30 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1bc40 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ,j)>=0 ) continu
1bc50 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e;.      pIndex-
1bc60 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b  >isCovering = 0;
1bc70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bc80 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1bc90 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1bca0 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
1bcb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
1bcc0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
1bcd0 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
1bce0 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
1bcf0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
1bd00 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1bd10 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1bd20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
1bd30 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
1bd40 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
1bd50 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1bd60 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
1bd70 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1bd80 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
1bd90 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
1bda0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1bdb0 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
1bdc0 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
1bdd0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
1bde0 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
1bdf0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1be00 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
1be10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1be20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
1be30 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
1be40 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
1be50 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
1be60 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
1be70 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
1be80 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
1be90 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1bea0 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
1beb0 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
1bec0 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
1bed0 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
1bee0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bef0 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
1bf00 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1bf10 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
1bf20 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
1bf30 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
1bf40 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
1bf50 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
1bf60 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
1bf70 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
1bf80 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
1bf90 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1bfa0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1bfb0 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1bfc0 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
1bfd0 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
1bfe0 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
1bff0 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
1c000 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
1c010 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1c020 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
1c030 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1c040 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
1c050 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
1c060 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
1c070 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1c080 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1c090 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
1c0a0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
1c0b0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1c0c0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1c0d0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1c0e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c0f0 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
1c100 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1c110 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
1c120 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1c130 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
1c140 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1c150 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
1c160 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
1c170 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
1c180 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
1c190 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
1c1a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c1b0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1c1c0 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1c1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1c1e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30  ->aiColumn[k]>=0
1c1f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1c200 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1c210 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
1c220 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
1c230 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
1c240 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1c250 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
1c260 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1c270 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c280 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1c290 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c2a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
1c2b0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
1c2c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1c2d0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
1c2e0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
1c2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1c300 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
1c310 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
1c320 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
1c330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1c340 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
1c350 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
1c360 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
1c370 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1c380 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
1c390 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
1c3a0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
1c3b0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
1c3c0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
1c3d0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
1c3e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
1c3f0 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
1c400 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
1c410 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
1c420 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1c430 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
1c440 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
1c450 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
1c460 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
1c470 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
1c480 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1c490 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1c4a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1c4b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1c4c0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
1c4d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1c4e0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
1c4f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c500 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c520 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
1c530 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1c540 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
1c550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c560 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1c570 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1c580 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
1c590 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
1c5a0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
1c5b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1c5c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1c5d0 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65 3d      if( idxType=
1c5e0 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1c5f0 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64  PRIMARYKEY ) pId
1c600 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78  x->idxType = idx
1c610 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Type;.        if
1c620 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1c630 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CT ){.          
1c640 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1c650 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1c660 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  x;.          pPa
1c670 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d  rse->pNewIndex =
1c680 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20   pIndex;.       
1c690 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1c6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c6b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c6c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1c6d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1c6e0 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
1c6f0 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c  ECT ){..    /* L
1c700 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
1c710 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
1c720 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
1c730 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  the other.    **
1c740 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1c750 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
1c760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1c770 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1c780 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ==0 );.    if( d
1c790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1c7a0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
1c7b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 49        assert( !I
1c7c0 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1c7d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c7e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1c7f0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1c800 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1c810 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c  );.      p = sql
1c820 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1c830 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1c840 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1c850 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1c860 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1c870 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1c880 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1c890 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
1c8a0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1c8b0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
1c8c0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1c8d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  db);.        got
1c8e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c8f0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1c900 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
1c910 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
1c920 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66  Change;.      if
1c930 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1c940 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1c950 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1c960 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20  .newTnum;.      
1c970 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c980 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69  If this is the i
1c990 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e  nitial CREATE IN
1c9a0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f  DEX statement (o
1c9b0 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69  r CREATE TABLE i
1c9c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64  f the.    ** ind
1c9d0 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1c9e0 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1c9f0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1ca00 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1ca10 68 65 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20  hen.    ** emit 
1ca20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  code to allocate
1ca30 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70   the index rootp
1ca40 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20  age on disk and 
1ca50 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  make an entry fo
1ca60 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  r.    ** the ind
1ca70 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ex in the sqlite
1ca80 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
1ca90 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69  d populate the i
1caa0 6e 64 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a  ndex with.    **
1cab0 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20   content.  But, 
1cac0 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  do not do this i
1cad0 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20  f we are simply 
1cae0 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
1caf0 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a  te_master.    **
1cb00 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
1cb10 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
1cb20 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1cb30 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1cb40 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20  index.    ** of 
1cb50 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1cb60 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
1cb70 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
1cb80 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
1cb90 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
1cba0 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69  ated as an impli
1cbb0 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20  ed PRIMARY KEY. 
1cbc0 20 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20     ** or UNIQUE 
1cbd0 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1cbe0 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1cbf0 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1cc00 62 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a  ble.    ** has j
1cc10 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
1cc20 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
1cc30 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
1cc40 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
1cc50 6f 6e 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63  on.    ** step c
1cc60 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
1cc70 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
1cc80 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1cc90 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30  ) || pTblName!=0
1cca0 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a   ){.      Vdbe *
1ccb0 76 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  v;.      char *z
1ccc0 53 74 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Stmt;.      int 
1ccd0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1cce0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20  >nMem;..      v 
1ccf0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1cd00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1cd10 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1cd20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1cd30 78 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x;..      sqlite
1cd40 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1cd50 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
1cd60 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  iDb);..      /* 
1cd70 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
1cd80 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
1cd90 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e  x using CreateIn
1cda0 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a  dex. But before.
1cdb0 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73        ** doing s
1cdc0 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69  o, code a Noop i
1cdd0 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73  nstruction and s
1cde0 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73  tore its address
1cdf0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e   in .      ** In
1ce00 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1ce10 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1ce20 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1ce30 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1ce40 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
1ce50 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  Y and the table 
1ce60 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49  is actually a WI
1ce70 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1ce80 65 2e 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20  e. In .      ** 
1ce90 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f  that case the co
1cea0 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
1ceb0 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  widTable() routi
1cec0 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a  ne will replace.
1ced0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f        ** the Noo
1cee0 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f  p with a Goto to
1cef0 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56   jump over the V
1cf00 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74  DBE code generat
1cf10 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ed below. */.   
1cf20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1cf30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1cf40 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
1cf50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cf60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1cf70 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
1cf80 20 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f   iMem, BTREE_BLO
1cf90 42 4b 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  BKEY);..      /*
1cfa0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
1cfb0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1cfc0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1cfd0 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
1cfe0 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
1cff0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
1d000 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  /.      if( pSta
1d010 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rt ){.        in
1d020 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  t n = (int)(pPar
1d030 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
1d040 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70   - pName->z) + p
1d050 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1d060 6e 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  n.n;.        if(
1d070 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
1d080 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
1d090 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1d0a0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1d0b0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1d0c0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1d0d0 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73         zStmt = s
1d0e0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1d0f0 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
1d100 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
1d110 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
1d120 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
1d130 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65  NIQUE", n, pName
1d140 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->z);.      }els
1d150 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  e{.        /* An
1d160 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1d170 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1d180 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1d190 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1d1a0 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74  /.        /* zSt
1d1b0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1d1c0 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
1d1d0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
1d1e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1d1f0 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
1d200 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
1d210 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
1d220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1d230 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1d240 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1d250 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1d260 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1d270 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1d280 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20  Q);",.          
1d290 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1d2a0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
1d2b0 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49  ME,.          pI
1d2c0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1d2d0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1d2e0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4d  me,.          iM
1d2f0 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53  em,.          zS
1d300 74 6d 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  tmt.          );
1d310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1d320 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
1d330 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  ..      /* Fill 
1d340 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1d350 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1d360 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1d370 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1d380 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1d390 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1d3a0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1d3b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d3c0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
1d3d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d3e0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1d3f0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1d400 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d410 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1d420 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1d430 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d440 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1d450 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
1d460 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1d470 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1d480 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1d490 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1d4a0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ame));.        s
1d4b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d4c0 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1d4d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
1d4e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d4f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64  JumpHere(v, pInd
1d500 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d  ex->tnum);.    }
1d510 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1d520 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1d530 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1d540 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1d550 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1d560 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1d570 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1d580 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1d590 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1d5a0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1d5b0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1d5c0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1d5d0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1d5e0 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1d5f0 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1d600 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1d610 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1d620 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1d630 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1d640 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1d650 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1d660 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1d670 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1d680 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1d690 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1d6a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1d6b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1d6c0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1d6d0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1d6e0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1d6f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1d700 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1d710 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1d720 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1d730 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1d740 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1d750 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1d760 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1d770 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1d780 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1d790 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1d7a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1d7b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1d7c0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1d7d0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1d7e0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1d7f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1d800 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65  dex = 0;.  }.  e
1d810 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  lse if( IN_RENAM
1d820 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1d830 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1d840 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  pNewIndex==0 );.
1d850 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1d860 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1d870 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1d880 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1d890 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1d8a0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1d8b0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1d8c0 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46 72  ndex ) sqlite3Fr
1d8d0 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1d8e0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1d8f0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1d900 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1d910 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1d920 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1d930 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d940 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1d950 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d960 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1d970 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1d980 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1d990 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1d9a0 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1d9b0 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1d9c0 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1d9d0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1d9e0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1d9f0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1da00 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1da10 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1da20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1da30 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1da40 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1da50 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1da60 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1da70 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1da80 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1da90 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1daa0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1dab0 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1dac0 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1dad0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1dae0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1daf0 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1db00 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1db10 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1db20 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1db30 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1db40 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1db50 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1db60 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1db70 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1db80 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1db90 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1dba0 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1dbb0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1dbc0 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1dbd0 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1dbe0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1dbf0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1dc00 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1dc10 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1dc20 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1dc30 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1dc40 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1dc50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1dc60 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1dc70 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1dc80 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1dc90 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1dca0 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1dcb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dcc0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1dcd0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1dce0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dcf0 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1dd00 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1dd10 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1dd20 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1dd30 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1dd40 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1dd50 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1dd60 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1dd70 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1dd80 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1dd90 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68   /* Indexes with
1dda0 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74   default row est
1ddb0 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f  imates should no
1ddc0 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74  t have stat1 dat
1ddd0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  a */.  assert( !
1dde0 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
1ddf0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1de00 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d  first entry (num
1de10 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1de20 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65  he index) to the
1de30 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a   estimated .  **
1de40 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1de50 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1de60 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72   half the number
1de70 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1de80 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61  table.  ** for a
1de90 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
1dea0 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74    But do not let
1deb0 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72   the estimate dr
1dec0 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a  op below 10. */.
1ded0 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1dee0 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1def0 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  t;.  if( pIdx->p
1df00 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
1df10 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61  ) a[0] -= 10;  a
1df20 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
1df30 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
1df40 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1df50 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1df60 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1df70 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1df80 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1df90 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1dfa0 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1dfb0 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1dfc0 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1dfd0 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1dfe0 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1dff0 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1e000 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1e010 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1e020 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1e030 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1e040 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1e050 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1e060 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1e090 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1e0a0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e0b0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1e0c0 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1e0d0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1e0e0 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1e0f0 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1e100 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e110 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1e120 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1e130 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1e140 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1e150 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1e160 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1e170 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1e180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e190 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1e1a0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1e1b0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1e1c0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1e1d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1e1e0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1e1f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e200 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1e210 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1e220 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1e230 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1e240 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1e250 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1e260 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1e270 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1e280 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1e290 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1e2a0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1e2b0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1e2c0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e2d0 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1e2e0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1e2f0 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1e300 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1e310 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1e320 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1e330 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1e340 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1e350 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e360 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1e370 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1e380 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1e390 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1e3a0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1e3b0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1e3c0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1e3d0 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1e3e0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1e3f0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1e400 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e410 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1e420 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1e430 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1e440 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1e450 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e460 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1e470 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1e480 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1e490 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1e4a0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1e4b0 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1e4c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1e4d0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1e4e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1e4f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1e500 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
1e510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e520 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1e530 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
1e540 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
1e550 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
1e560 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
1e570 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
1e580 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1e590 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1e5a0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1e5b0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
1e5c0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1e5d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e5e0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e5f0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
1e600 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
1e610 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1e620 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1e630 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1e640 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
1e650 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1e660 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
1e670 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e680 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
1e690 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
1e6a0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1e6b0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1e6c0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1e6d0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1e6e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1e6f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
1e700 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
1e710 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
1e720 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
1e730 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1e740 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1e750 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1e760 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1e770 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1e780 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
1e790 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1e7a0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
1e7b0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
1e7c0 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74  RE name=%Q AND t
1e7d0 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20  ype='index'",.  
1e7e0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1e7f0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1e800 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d  ER_NAME, pIndex-
1e810 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1e820 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
1e830 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
1e840 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e   iDb, "idx", pIn
1e850 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  dex->zName);.   
1e860 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1e870 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1e880 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
1e890 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
1e8a0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
1e8b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e8c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
1e8d0 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
1e8e0 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
1e8f0 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
1e900 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
1e910 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1e920 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
1e930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
1e940 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1e950 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
1e960 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63  ects. Each objec
1e970 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
1e980 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
1e990 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
1e9a0 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71   routine uses sq
1e9b0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29  lite3DbRealloc()
1e9c0 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68  .** to extend th
1e9d0 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  e array so that 
1e9e0 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66  there is space f
1e9f0 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  or a new object 
1ea00 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
1ea10 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
1ea20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1ea30 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e  *pnEntry contain
1ea40 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  s the current si
1ea50 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72  ze of.** the arr
1ea60 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d  ay (in entries -
1ea70 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   so the allocati
1ea80 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79  on is ((*pnEntry
1ea90 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74  ) * szEntry) byt
1eaa0 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e  es.** in total).
1eab0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1eac0 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65  alloc() is succe
1ead0 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e  ssful (i.e. if n
1eae0 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  o OOM condition 
1eaf0 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20  occurs), the.** 
1eb00 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1eb10 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  for the new obje
1eb20 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70  ct is zeroed, *p
1eb30 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74  nEntry updated t
1eb40 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65  o.** reflect the
1eb50 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1eb60 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69   array and a poi
1eb70 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1eb80 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65  allocation.** re
1eb90 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73  turned. *pIdx is
1eba0 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
1ebb0 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72  x of the new arr
1ebc0 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  ay entry in this
1ebd0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   case..**.** Oth
1ebe0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72  erwise, if the r
1ebf0 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20  ealloc() fails, 
1ec00 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1ec10 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d  -1, *pnEntry rem
1ec20 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ains.** unchange
1ec30 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  d and a copy of 
1ec40 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e  pArray returned.
1ec50 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
1ec60 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1ec70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ec80 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1ec90 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1eca0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1ecb0 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
1ecc0 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
1ecd0 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
1ece0 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
1ecf0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
1ed00 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
1ed10 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
1ed20 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
1ed30 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
1ed40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ed50 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
1ed60 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
1ed70 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  t *pIdx         
1ed80 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64  /* Write the ind
1ed90 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74  ex of a new slot
1eda0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   here */.){.  ch
1edb0 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  ar *z;.  int n =
1edc0 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28   *pnEntry;.  if(
1edd0 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20   (n & (n-1))==0 
1ede0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  ){.    int sz = 
1edf0 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1ee00 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1ee10 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1ee20 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1ee30 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1ee40 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1ee50 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1ee60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1ee70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1ee80 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1ee90 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1eea0 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1eeb0 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1eec0 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1eed0 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b    *pIdx = n;.  +
1eee0 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
1eef0 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
1ef00 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1ef10 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1ef20 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
1ef30 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
1ef40 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1ef50 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
1ef60 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
1ef70 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
1ef80 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1ef90 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
1efa0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72  IdListAppend(Par
1efb0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
1efc0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1efd0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c   *pToken){.  sql
1efe0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1eff0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
1f000 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1f010 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1f020 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1f030 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1f040 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1f050 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1f060 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1f070 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1f080 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1f090 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1f0a0 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1f0b0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1f0c0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1f0d0 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1f0e0 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1f0f0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1f100 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1f110 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1f120 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1f130 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1f140 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1f150 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
1f160 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1f170 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  ECT && pList->a[
1f180 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1f190 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
1f1a0 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
1f1b0 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d  oid*)pList->a[i]
1f1c0 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  .zName, pToken);
1f1d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
1f1e0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1f1f0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1f200 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1f210 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1f220 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1f230 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f240 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1f250 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1f260 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1f270 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1f280 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f290 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1f2a0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1f2b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1f2c0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1f2d0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
1f2e0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1f2f0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1f300 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1f310 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1f320 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1f330 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1f340 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1f350 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1f360 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1f370 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1f380 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1f390 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1f3a0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1f3b0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1f3c0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f3d0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1f3e0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1f3f0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1f400 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1f410 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  1;.}../*.** Maxi
1f420 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 20 53 72  mum size of a Sr
1f430 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a  cList object..**
1f440 20 54 68 65 20 53 72 63 4c 69 73 74 20 6f 62 6a   The SrcList obj
1f450 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72  ect is used to r
1f460 65 70 72 65 73 65 6e 74 20 74 68 65 20 46 52 4f  epresent the FRO
1f470 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 0a 2a 2a  M clause of a.**
1f480 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1f490 74 2c 20 61 6e 64 20 74 68 65 20 71 75 65 72 79  t, and the query
1f4a0 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e 6f 74 20   planner cannot 
1f4b0 64 65 61 6c 20 77 69 74 68 20 6d 6f 72 65 0a 2a  deal with more.*
1f4c0 2a 20 74 68 61 6e 20 36 34 20 74 61 62 6c 65 73  * than 64 tables
1f4d0 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 53 6f 20   in a join.  So 
1f4e0 61 6e 79 20 76 61 6c 75 65 20 6c 61 72 67 65 72  any value larger
1f4f0 20 74 68 61 6e 20 36 34 20 68 65 72 65 0a 2a 2a   than 64 here.**
1f500 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 66   is sufficient f
1f510 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e 20 20 53  or most uses.  S
1f520 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73 2c 20 6c  maller values, l
1f530 69 6b 65 20 73 61 79 20 31 30 2c 20 61 72 65 0a  ike say 10, are.
1f540 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
1f550 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20 6d 65 6d  or small and mem
1f560 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61 70 70 6c  ory-limited appl
1f570 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  ications..*/.#if
1f580 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ndef SQLITE_MAX_
1f590 53 52 43 4c 49 53 54 0a 23 20 64 65 66 69 6e 65  SRCLIST.# define
1f5a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c   SQLITE_MAX_SRCL
1f5b0 49 53 54 20 32 30 30 0a 23 65 6e 64 69 66 0a 0a  IST 200.#endif..
1f5c0 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1f5d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1f5e0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1f5f0 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1f600 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1f610 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1f620 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1f630 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1f640 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1f650 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1f660 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1f670 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1f680 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1f690 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1f6a0 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1f6b0 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1f6c0 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1f6d0 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1f6e0 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1f6f0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1f700 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1f710 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1f720 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1f730 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1f740 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1f750 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1f760 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1f770 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1f780 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1f790 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1f7a0 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1f7b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1f7c0 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1f7d0 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1f7e0 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1f7f0 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1f800 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1f810 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1f820 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1f830 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1f840 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1f850 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1f860 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1f870 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1f880 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1f890 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1f8a0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1f8b0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1f8c0 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1f8d0 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1f8e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1f8f0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1f900 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1f910 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1f920 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1f930 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1f940 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1f950 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f960 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1f970 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1f980 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1f990 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1f9a0 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1f9b0 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1f9c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1f9d0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1f9e0 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1f9f0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1fa00 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1fa10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fa20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1fa30 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1fa40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1fa50 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1fa60 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1fa70 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1fa80 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1fa90 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1faa0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1fab0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1fac0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1fad0 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1fae0 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78  pSrc->nSrc*2+nEx
1faf0 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1fb00 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
1fb10 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53  ->nSrc+nExtra>=S
1fb20 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
1fb30 54 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 49  T ){.      /* FI
1fb40 58 4d 45 3a 20 52 65 74 75 72 6e 20 61 20 62 65  XME: Return a be
1fb50 74 74 65 72 20 65 72 72 6f 72 20 74 68 61 6e 20  tter error than 
1fb60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 77 68 65  SQLITE_NOMEM whe
1fb70 6e 20 74 68 65 20 73 69 7a 65 0a 20 20 20 20 20  n the size.     
1fb80 20 2a 2a 20 6f 66 20 61 20 53 72 63 4c 69 73 74   ** of a SrcList
1fb90 20 6f 62 6a 65 63 74 20 67 65 74 73 20 74 6f 20   object gets to 
1fba0 62 65 20 74 6f 6f 20 62 69 67 2e 20 20 54 6f 20  be too big.  To 
1fbb0 66 69 78 20 74 68 69 73 20 77 69 6c 6c 20 72 65  fix this will re
1fbc0 71 75 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 72  quire.      ** r
1fbd0 65 70 6c 75 6d 62 69 6e 67 20 74 6f 20 70 61 73  eplumbing to pas
1fbe0 73 20 50 61 72 73 65 2a 20 69 6e 73 74 65 61 64  s Parse* instead
1fbf0 20 6f 66 20 73 71 6c 69 74 65 33 2a 20 61 73 20   of sqlite3* as 
1fc00 74 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  the first parame
1fc10 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ter.      ** to 
1fc20 74 68 65 20 53 72 63 4c 69 73 74 20 61 6c 6c 6f  the SrcList allo
1fc30 63 61 74 6f 72 73 2e 20 20 41 73 20 74 68 69 73  cators.  As this
1fc40 20 6e 65 76 65 72 20 63 6f 6d 65 73 20 75 70 20   never comes up 
1fc50 69 6e 20 72 65 61 6c 2d 77 6f 72 6c 64 0a 20 20  in real-world.  
1fc60 20 20 20 20 2a 2a 20 75 73 61 67 65 2c 20 74 68      ** usage, th
1fc70 65 20 66 69 78 20 69 73 20 61 20 6c 6f 77 20 70  e fix is a low p
1fc80 72 69 6f 72 69 74 79 2e 20 2a 2f 0a 20 20 20 20  riority. */.    
1fc90 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
1fca0 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
1fcb0 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
1fcc0 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 3e 53      if( nAlloc>S
1fcd0 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
1fce0 54 20 29 20 6e 41 6c 6c 6f 63 20 3d 20 53 51 4c  T ) nAlloc = SQL
1fcf0 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 3b  ITE_MAX_SRCLIST;
1fd00 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1fd10 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1fd20 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1fd30 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1fd40 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1fd50 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1fd60 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1fd70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1fd80 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1fd90 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1fda0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1fdb0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1fdc0 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1fdd0 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1fde0 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1fdf0 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1fe00 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1fe10 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1fe20 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1fe30 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1fe40 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1fe50 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1fe60 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1fe70 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1fe80 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1fe90 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1fea0 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1feb0 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1fec0 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1fed0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1fee0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1fef0 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1ff00 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1ff10 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1ff20 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1ff30 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1ff40 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1ff50 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1ff60 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1ff70 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1ff80 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1ff90 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1ffa0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1ffb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1ffc0 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1ffd0 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1ffe0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1fff0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
20000 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
20010 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
20020 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
20030 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
20040 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
20050 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
20060 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
20070 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
20080 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
20090 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
200a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
200b0 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
200c0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
200d0 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
200e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
200f0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
20100 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
20110 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
20120 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
20130 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
20140 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
20150 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
20160 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
20170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
20190 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
201a0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
201b0 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
201c0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
201d0 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
201e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
201f0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
20200 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
20210 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
20220 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
20230 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
20240 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
20250 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
20260 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
20270 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
20280 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
20290 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
202a0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
202b0 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
202c0 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
202d0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
202e0 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
202f0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
20300 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
20310 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
20320 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
20330 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
20340 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
20350 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
20360 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
20370 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20380 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
20390 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
203a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
203b0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
203c0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
203d0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
203e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
203f0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
20400 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
20410 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
20420 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
20430 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
20440 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
20450 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
20460 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
20470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
20480 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
20490 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
204a0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
204b0 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
204c0 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
204d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
204e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
204f0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
20500 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
20510 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
20520 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
20530 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
20540 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
20550 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
20560 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
20570 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
20580 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
20590 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
205a0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
205b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
205c0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
205d0 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
205e0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
205f0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
20600 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
20610 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
20620 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
20630 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
20640 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
20650 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
20660 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
20670 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
20680 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
20690 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
206a0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
206b0 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
206c0 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
206d0 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
206e0 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61  without B */.  a
206f0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
20700 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
20710 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
20720 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
20730 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  NN(db, sizeof(Sr
20740 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
20750 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
20760 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
20770 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
20780 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20    pList->nSrc = 
20790 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  1;.    memset(&p
207a0 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73  List->a[0], 0, s
207b0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
207c0 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ]));.    pList->
207d0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[0].iCursor = -
207e0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
207f0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
20800 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
20810 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
20820 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20  t->nSrc);.  }.  
20830 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
20840 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
20850 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
20860 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
20870 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
20880 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
20890 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
208a0 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
208b0 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
208c0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
208d0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
208e0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
208f0 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  ){.    pItem->zN
20900 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
20910 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
20920 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
20930 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
20940 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
20950 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
20960 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
20970 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
20980 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20990 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
209a0 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
209b0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
209c0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
209d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
209e0 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
209f0 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
20a00 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
20a10 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
20a20 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
20a30 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
20a40 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
20a50 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
20a60 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
20a70 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
20a80 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
20a90 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
20aa0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
20ab0 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
20ac0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
20ad0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
20ae0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
20af0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
20b00 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
20b10 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
20b20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
20b30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
20b40 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
20b50 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
20b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
20b70 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
20b80 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
20b90 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
20ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20bb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
20bc0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
20bd0 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
20be0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
20bf0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
20c00 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
20c10 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
20c20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
20c30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
20c40 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20c50 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
20c60 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
20c70 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
20c80 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
20c90 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
20ca0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
20cb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20cc0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
20cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
20ce0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
20cf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
20d00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
20d10 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
20d20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
20d30 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
20d40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20d50 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
20d60 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
20d70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
20d80 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
20d90 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
20da0 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
20db0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
20dc0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
20dd0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
20de0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
20df0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
20e00 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
20e10 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
20e20 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
20e30 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
20e40 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
20e50 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
20e60 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20e70 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  NN(db, pList);.}
20e80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20e90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
20ea0 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
20eb0 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
20ec0 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
20ed0 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
20ee0 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
20ef0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
20f00 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
20f10 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
20f20 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
20f30 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
20f40 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
20f50 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
20f60 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
20f70 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
20f80 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
20f90 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
20fa0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
20fb0 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
20fc0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
20fd0 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
20fe0 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
20ff0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
21000 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
21010 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
21020 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
21030 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
21040 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20   an alias, then 
21050 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
21060 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
21070 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
21080 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
21090 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
210a0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
210b0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
210c0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
210d0 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
210e0 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
210f0 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
21100 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
21110 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
21120 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
21130 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
21140 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21150 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
21160 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
21170 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
21180 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
21190 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
211a0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
211b0 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
211c0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
211d0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
211e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
211f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
21200 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
21210 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
21220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21230 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
21240 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
21250 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
21260 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
21270 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21280 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
21290 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
212a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
212b0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
212c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
212d0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
212e0 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
212f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
21300 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
21310 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
21320 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
21330 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
21340 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
21350 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
21360 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
21370 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
21380 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
21390 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
213a0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
213b0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
213c0 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
213d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
213e0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
213f0 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
21400 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21410 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
21420 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21430 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
21440 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
21450 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
21460 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21470 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
21480 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
21490 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
214a0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
214b0 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
214c0 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
214d0 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
214e0 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
214f0 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
21500 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
21510 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
21520 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
21530 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
21540 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
21550 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65 6d  Src>0 );.  pItem
21560 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
21570 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  -1];.  assert( (
21580 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44 61  pTable==0)==(pDa
21590 74 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20 20  tabase==0) );.  
215a0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
215b0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74 61  Name==0 || pData
215c0 62 61 73 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  base!=0 );.  if(
215d0 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
215e0 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  T && pItem->zNam
215f0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
21600 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59 53  pToken = (ALWAYS
21610 28 70 44 61 74 61 62 61 73 65 29 20 26 26 20 70  (pDatabase) && p
21620 44 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20 70  Database->z) ? p
21630 44 61 74 61 62 61 73 65 20 3a 20 70 54 61 62 6c  Database : pTabl
21640 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  e;.    sqlite3Re
21650 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
21660 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  rse, pItem->zNam
21670 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  e, pToken);.  }.
21680 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73    assert( pAlias
21690 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c  !=0 );.  if( pAl
216a0 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
216b0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
216c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
216d0 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
216e0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
216f0 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
21700 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
21710 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
21720 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
21730 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70    return p;.. ap
21740 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a  pend_from_error:
21750 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
21760 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
21770 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
21780 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
21790 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e  Delete(db, pUsin
217a0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  g);.  sqlite3Sel
217b0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
217c0 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75  ubquery);.  retu
217d0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
217e0 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  dd an INDEXED BY
217f0 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   or NOT INDEXED 
21800 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f  clause to the mo
21810 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
21820 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66  d .** element of
21830 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
21840 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
21850 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
21860 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
21870 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
21880 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
21890 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e  rcList *p, Token
218a0 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20   *pIndexedBy){. 
218b0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65   assert( pIndexe
218c0 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dBy!=0 );.  if( 
218d0 70 20 26 26 20 70 49 6e 64 65 78 65 64 42 79 2d  p && pIndexedBy-
218e0 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75  >n>0 ){.    stru
218f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21900 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65  *pItem;.    asse
21910 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b  rt( p->nSrc>0 );
21920 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 2d  .    pItem = &p-
21930 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
21940 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
21950 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
21960 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21970 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
21980 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
21990 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
219a0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
219b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
219c0 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
219d0 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
219e0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
219f0 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
21a00 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
21a10 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
21a20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
21a30 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
21a40 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
21a50 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f      pItem->fg.no
21a60 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20  tIndexed = 1;.  
21a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21a80 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
21a90 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  dBy = sqlite3Nam
21aa0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
21ab0 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42  e->db, pIndexedB
21ac0 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  y);.      pItem-
21ad0 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20  >fg.isIndexedBy 
21ae0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
21af0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
21b00 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  list of function
21b10 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
21b20 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79 20  e SrcList entry 
21b30 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76  for a.** table-v
21b40 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a  alued-function..
21b50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
21b60 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 50  rcListFuncArgs(P
21b70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
21b80 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c 69  cList *p, ExprLi
21b90 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66  st *pList){.  if
21ba0 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ( p ){.    struc
21bb0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21bc0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
21bd0 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73  >nSrc-1];.    as
21be0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
21bf0 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b  notIndexed==0 );
21c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
21c10 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
21c20 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  By==0 );.    ass
21c30 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
21c40 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20  sTabFunc==0 );. 
21c50 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75     pItem->u1.pFu
21c60 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a 20  ncArg = pList;. 
21c70 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54     pItem->fg.isT
21c80 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d 65  abFunc = 1;.  }e
21c90 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
21ca0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
21cb0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
21cc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21cd0 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70  When building up
21ce0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69   a FROM clause i
21cf0 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  n the parser, th
21d00 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a  e join operator.
21d10 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  ** is initially 
21d20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
21d30 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42  left operand.  B
21d40 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ut the code gene
21d50 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73  rator.** expects
21d60 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
21d70 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20  or to be on the 
21d80 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20  right operand.  
21d90 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
21da0 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20  Shifts all join 
21db0 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c  operators from l
21dc0 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72  eft to right for
21dd0 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a   an entire FROM.
21de0 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ** clause..**.**
21df0 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73   Example: Suppos
21e00 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69  e the join is li
21e10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
21e20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72           A natur
21e30 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a  al cross join B.
21e40 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74  **.** The operat
21e50 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63  or is "natural c
21e60 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65  ross join".  The
21e70 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64   A and B operand
21e80 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
21e90 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70  in p->a[0] and p
21ea0 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69  ->a[1], respecti
21eb0 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65  vely.  The parse
21ec0 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72  r initially stor
21ed0 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  es the.** operat
21ee0 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73  or with A.  This
21ef0 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20   routine shifts 
21f00 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76  that operator ov
21f10 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64  er to B..*/.void
21f20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53   sqlite3SrcListS
21f30 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63  hiftJoinType(Src
21f40 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  List *p){.  if( 
21f50 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
21f60 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72      for(i=p->nSr
21f70 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  c-1; i>0; i--){.
21f80 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67        p->a[i].fg
21f90 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61  .jointype = p->a
21fa0 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  [i-1].fg.jointyp
21fb0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
21fc0 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[0].fg.jointype
21fd0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21fe0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
21ff0 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47 49   code for a BEGI
22000 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  N statement..*/.
22010 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
22020 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
22030 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
22040 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
22050 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
22060 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
22070 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
22080 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
22090 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
220a0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
220b0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
220c0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
220d0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
220e0 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  N", 0, 0) ){.   
220f0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
22100 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
22110 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
22120 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
22130 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
22140 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
22150 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
22160 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
22170 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22180 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
22190 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
221a0 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
221b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
221c0 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a  sesBtree(v, i);.
221d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
221e0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
221f0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29 3b   OP_AutoCommit);
22200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22210 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
22220 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c   a COMMIT or ROL
22230 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74 2e  LBACK statement.
22240 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f 4c  .** Code for ROL
22250 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61 74  LBACK is generat
22260 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b 5f  ed if eType==TK_
22270 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65 72  ROLLBACK.  Other
22280 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73 20  wise.** code is 
22290 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61 20  generated for a 
222a0 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64 20  COMMIT..*/.void 
222b0 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73 61  sqlite3EndTransa
222c0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
222d0 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29 7b  rse, int eType){
222e0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
222f0 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a 20  t isRollback;.. 
22300 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
22310 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22320 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
22330 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
22340 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20 65  ==TK_COMMIT || e
22350 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c 20  Type==TK_END || 
22360 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41  eType==TK_ROLLBA
22370 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62 61  CK );.  isRollba
22380 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f 52  ck = eType==TK_R
22390 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20 73  OLLBACK;.  if( s
223a0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
223b0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
223c0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20 20  RANSACTION, .   
223d0 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3f      isRollback ?
223e0 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43   "ROLLBACK" : "C
223f0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
22400 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
22410 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
22420 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
22430 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
22440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22450 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
22460 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b 29  , 1, isRollback)
22470 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
22480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22490 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
224a0 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72  rser when it par
224b0 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ses a command to
224c0 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65   create,.** rele
224d0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
224e0 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74  an SQL savepoint
224f0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
22500 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73  e3Savepoint(Pars
22510 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
22520 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  p, Token *pName)
22530 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
22540 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
22550 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
22560 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
22570 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64   zName ){.    Vd
22580 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
22590 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
225a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
225b0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
225c0 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  N.    static con
225d0 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
225e0 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22  az[] = { "BEGIN"
225f0 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f  , "RELEASE", "RO
22600 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61  LLBACK" };.    a
22610 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e  ssert( !SAVEPOIN
22620 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50  T_BEGIN && SAVEP
22630 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20  OINT_RELEASE==1 
22640 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  && SAVEPOINT_ROL
22650 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64  LBACK==2 );.#end
22660 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c  if.    if( !v ||
22670 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
22680 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
22690 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f  _SAVEPOINT, az[o
226a0 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  p], zName, 0) ){
226b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
226c0 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
226d0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
226e0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
226f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22700 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69  p4(v, OP_Savepoi
22710 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e  nt, op, 0, 0, zN
22720 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
22730 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
22740 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
22750 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
22760 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
22770 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
22780 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
22790 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
227a0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
227b0 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
227c0 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
227d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
227e0 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
227f0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
22800 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
22810 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
22820 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
22830 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
22840 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
22850 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  rc;.    Btree *p
22860 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  Bt;.    static c
22870 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
22880 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
22890 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
228a0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
228b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
228c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
228d0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
228e0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  VE |.          S
228f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22900 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
22910 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22920 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72  _TEMP_DB;..    r
22930 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22940 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
22950 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66  , db, &pBt, 0, f
22960 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
22970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22980 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22990 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
229a0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
229b0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
229c0 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
229d0 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
229e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
229f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
22a00 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
22a10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
22a20 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70      db->aDb[1].p
22a30 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73  Bt = pBt;.    as
22a40 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
22a50 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
22a60 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  if( SQLITE_NOMEM
22a70 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  ==sqlite3BtreeSe
22a80 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64  tPageSize(pBt, d
22a90 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c  b->nextPagesize,
22aa0 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20   -1, 0) ){.     
22ab0 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
22ac0 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
22ad0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
22ae0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22af0 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
22b00 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63  fact that the sc
22b10 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c  hema cookie will
22b20 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69   need to be veri
22b30 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61  fied.** for data
22b40 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63  base iDb.  The c
22b50 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ode to actually 
22b60 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
22b70 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c  a cookie.** will
22b80 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
22b90 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  d of the top-lev
22ba0 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c  el VDBE and will
22bb0 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a   be generated.**
22bc0 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74   later, by sqlit
22bd0 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
22be0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22bf0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
22c00 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
22c10 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
22c20 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
22c30 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
22c40 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  evel(pParse);.. 
22c50 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
22c60 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64  && iDb<pParse->d
22c70 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
22c80 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
22c90 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
22ca0 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61  || iDb==1 );.  a
22cb0 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
22cc0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
22cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22ce0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
22cf0 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  Held(pParse->db,
22d00 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66   iDb, 0) );.  if
22d10 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f  ( DbMaskTest(pTo
22d20 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
22d30 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20  sk, iDb)==0 ){. 
22d40 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f     DbMaskSet(pTo
22d50 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
22d60 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66  sk, iDb);.    if
22d70 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
22d80 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
22d90 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
22da0 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65  pDatabase(pTople
22db0 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  vel);.    }.  }.
22dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75  }../*.** If argu
22dd0 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c  ment zDb is NULL
22de0 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  , then call sqli
22df0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
22e00 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a  ema() for each .
22e10 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
22e20 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  base. Otherwise,
22e30 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74   invoke it for t
22e40 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
22e50 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  d zDb only..*/.v
22e60 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
22e70 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
22e80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22e90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
22ea0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22eb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22ec0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
22ed0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
22ee0 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
22ef0 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
22f00 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26    if( pDb->pBt &
22f10 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71  & (!zDb || 0==sq
22f20 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
22f30 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
22f40 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
22f50 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
22f60 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
22f70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
22f80 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
22f90 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
22fa0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
22fb0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
22fc0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
22fd0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
22fe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22ff0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
23000 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
23010 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
23020 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
23030 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
23040 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
23050 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
23060 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
23070 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
23080 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
23090 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
230a0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
230b0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
230c0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
230d0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
230e0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
230f0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
23100 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
23110 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
23120 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
23130 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
23140 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
23150 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
23160 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
23170 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
23180 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
23190 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
231a0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
231b0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
231c0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
231d0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
231e0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
231f0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
23200 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
23210 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
23220 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
23230 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
23240 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
23250 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
23260 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
23270 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
23280 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
23290 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
232a0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
232b0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
232c0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44  Parse, iDb);.  D
232d0 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
232e0 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69  el->writeMask, i
232f0 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  Db);.  pToplevel
23300 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c  ->isMultiWrite |
23310 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a  = setStatement;.
23320 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
23330 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
23340 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75  ment currently u
23350 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
23360 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a  n might write.**
23370 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
23380 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64  ntry (example: d
23390 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20  eleting one row 
233a0 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61  then inserting a
233b0 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72  nother,.** inser
233c0 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ting multiple ro
233d0 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f  ws in a table, o
233e0 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f  r inserting a ro
233f0 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  w and index entr
23400 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61  ies.).** If an a
23410 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65  bort occurs afte
23420 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  r some of these 
23430 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70  writes have comp
23440 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77  leted, then it w
23450 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  ill.** be necess
23460 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20  ary to undo the 
23470 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73  completed writes
23480 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23490 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73  3MultiWrite(Pars
234a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
234b0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
234c0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
234d0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
234e0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
234f0 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a  ltiWrite = 1;.}.
23500 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ./* .** The code
23510 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73   generator calls
23520 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66   this routine if
23530 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68   is discovers th
23540 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73  at it is.** poss
23550 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20  ible to abort a 
23560 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20  statement prior 
23570 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  to completion.  
23580 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20  In order to .** 
23590 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f  perform this abo
235a0 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75  rt without corru
235b0 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pting the databa
235c0 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  se, we need to m
235d0 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74  ake.** sure that
235e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
235f0 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  s protected by a
23600 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
23610 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65  action..**.** Te
23620 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e  chnically, we on
23630 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74  ly need to set t
23640 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67  he mayAbort flag
23650 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c   if the.** isMul
23660 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73  tiWrite flag was
23670 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e   previously set.
23680 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d    There is a tim
23690 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
236a0 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62  such that the ab
236b0 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61  ort must occur a
236c0 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72  fter the multiwr
236d0 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ite.  This makes
236e0 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65  .** some stateme
236f0 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68  nts involving th
23700 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69  e REPLACE confli
23710 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
23720 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20  gorithm.** go a 
23730 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20  little faster.  
23740 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e  But taking advan
23750 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d  tage of this tim
23760 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
23770 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69  makes it more di
23780 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65  fficult to prove
23790 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69   that the code i
237a0 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a  s correct (in .*
237b0 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74  * particular, it
237c0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
237d0 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66  m writing an eff
237e0 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d  ective.** implem
237f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69  entation of sqli
23800 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
23810 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68  t()) and so we h
23820 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f  ave chosen.** to
23830 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72   take the safe r
23840 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68  oute and skip th
23850 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
23860 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
23870 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70  ayAbort(Parse *p
23880 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
23890 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
238a0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
238b0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
238c0 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74  plevel->mayAbort
238d0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
238e0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74  ode an OP_Halt t
238f0 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76  hat causes the v
23900 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  dbe to return an
23910 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
23920 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65  NT.** error. The
23930 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74   onError paramet
23940 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
23950 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20  ich (if any) of 
23960 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
23970 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20   and/or current 
23980 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
23990 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76  olled back..*/.v
239a0 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43  oid sqlite3HaltC
239b0 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
239c0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
239d0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
239e0 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  t */.  int errCo
239f0 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65  de,      /* exte
23a00 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  nded error code 
23a10 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
23a20 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
23a30 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63  aint type */.  c
23a40 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20  har *p4,        
23a50 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
23a60 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65  e */.  i8 p4type
23a70 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53  ,        /* P4_S
23a80 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e  TATIC or P4_TRAN
23a90 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35  SIENT */.  u8 p5
23aa0 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20  Errmsg       /* 
23ab0 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a  P5_ErrMsg type *
23ac0 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
23ad0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
23ae0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
23af0 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66  t( (errCode&0xff
23b00 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
23b10 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e  AINT );.  if( on
23b20 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
23b30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
23b40 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
23b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
23b60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
23b70 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45  lt, errCode, onE
23b80 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
23b90 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ype);.  sqlite3V
23ba0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
23bb0 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  5Errmsg);.}../*.
23bc0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
23bd0 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45  lt due to UNIQUE
23be0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
23bf0 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
23c00 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
23c10 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
23c20 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
23c30 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
23c40 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23c50 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
23c60 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
23c70 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64  nt type */.  Ind
23c80 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f  ex *pIdx       /
23c90 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
23ca0 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f   triggers the co
23cb0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
23cc0 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69   char *zErr;.  i
23cd0 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt j;.  StrAccum
23ce0 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65   errMsg;.  Table
23cf0 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
23d00 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Table;..  sqlite
23d10 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65  3StrAccumInit(&e
23d20 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64  rrMsg, pParse->d
23d30 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20  b, 0, 0, 200);. 
23d40 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45   if( pIdx->aColE
23d50 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
23d60 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
23d70 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27  errMsg, "index '
23d80 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  %q'", pIdx->zNam
23d90 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
23da0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
23db0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
23dc0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
23dd0 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
23de0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
23df0 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a  j]>=0 );.      z
23e00 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
23e10 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
23e20 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  j]].zName;.     
23e30 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33   if( j ) sqlite3
23e40 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72  _str_append(&err
23e50 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20  Msg, ", ", 2);. 
23e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
23e70 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d  _appendall(&errM
23e80 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  sg, pTab->zName)
23e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
23ea0 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d  str_append(&errM
23eb0 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  sg, ".", 1);.   
23ec0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
23ed0 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67  ppendall(&errMsg
23ee0 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
23ef0 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69   }.  zErr = sqli
23f00 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
23f10 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71  h(&errMsg);.  sq
23f20 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
23f30 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20  int(pParse, .   
23f40 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
23f50 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54  ex(pIdx) ? SQLIT
23f60 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
23f70 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20  MARYKEY .       
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f       : SQLITE_CO
23fa0 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c  NSTRAINT_UNIQUE,
23fb0 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  .    onError, zE
23fc0 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20  rr, P4_DYNAMIC, 
23fd0 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
23fe0 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  que);.}.../*.** 
23ff0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
24000 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75  due to non-uniqu
24010 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64  e rowid..*/.void
24020 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e   sqlite3RowidCon
24030 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
24040 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
24050 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24060 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
24070 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69  ,      /* Confli
24080 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
24090 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62  gorithm */.  Tab
240a0 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f  le *pTab       /
240b0 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68  * The table with
240c0 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20   the non-unique 
240d0 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63  rowid */ .){.  c
240e0 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74  har *zMsg;.  int
240f0 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d   rc;.  if( pTab-
24100 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
24110 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
24120 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
24130 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
24140 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54     pTab->aCol[pT
24170 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65  ab->iPKey].zName
24180 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
24190 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
241a0 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73  IMARYKEY;.  }els
241b0 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  e{.    zMsg = sq
241c0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
241d0 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77  rse->db, "%s.row
241e0 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  id", pTab->zName
241f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
24200 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
24210 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  WID;.  }.  sqlit
24220 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
24230 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45  (pParse, rc, onE
24240 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  rror, zMsg, P4_D
24250 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20  YNAMIC,.        
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
24280 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  que);.}../*.** C
24290 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
242a0 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
242b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
242c0 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
242d0 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
242e0 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
242f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
24300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24310 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
24320 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
24330 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
24340 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
24350 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
24360 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
24370 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
24380 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
24390 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
243a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
243b0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
243c0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
243d0 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  z!=0 || pIndex->
243e0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b  aiColumn[i]<0 );
243f0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
24400 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
24410 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
24420 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29  ICmp(z, zColl) )
24430 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
24440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24450 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
24460 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
24470 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
24480 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
24490 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
244a0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
244b0 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
244c0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
244d0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
244e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
244f0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
24500 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
24510 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
24520 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
24530 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
24540 7a 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 21 49  zColl){.  if( !I
24550 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
24560 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
24570 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
24580 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
24590 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
245a0 61 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 70  ab */..    for(p
245b0 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
245c0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
245d0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
245e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  ){.      if( zCo
245f0 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
24600 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
24610 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
24620 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
24630 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
24640 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
24650 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
24660 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
24670 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
24680 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
24690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
246a0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
246b0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
246c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
246d0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
246e0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
246f0 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
24700 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
24710 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
24720 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
24730 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
24740 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
24750 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
24760 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
24770 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
24780 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
24790 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
247a0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
247b0 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
247c0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
247d0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
247e0 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24800 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
24810 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
24820 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
24830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24840 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
24850 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
24860 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24870 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
24880 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24890 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
248a0 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
248b0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
248c0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
248d0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
248e0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
248f0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
24900 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24910 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
24920 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
24930 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
24940 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  ;  /* Needed for
24950 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a   schema access *
24960 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  /.  for(iDb=0, p
24970 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
24980 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
24990 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  pDb++){.    asse
249a0 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20  rt( pDb!=0 );.  
249b0 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
249c0 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
249d0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
249e0 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
249f0 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
24a00 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
24a10 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
24a20 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
24a30 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
24a40 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
24a50 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
24a60 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
24a70 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
24a80 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
24a90 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
24aa0 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
24ac0 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
24ad0 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
24af0 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
24b00 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
24b10 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
24b20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
24b30 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
24b40 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
24b50 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
24b60 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
24b70 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
24b80 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
24b90 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
24ba0 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
24bb0 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
24bc0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
24bd0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
24be0 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
24bf0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
24c00 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
24c10 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
24c20 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
24c30 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
24c40 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
24c50 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
24c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
24c70 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
24c80 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
24c90 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
24ca0 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
24cb0 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
24cc0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
24cd0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
24ce0 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
24cf0 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
24d00 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
24d30 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
24d40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
24d50 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
24d60 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
24d70 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
24d80 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
24d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
24da0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
24db0 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
24dc0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
24dd0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
24de0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
24df0 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
24e00 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
24e10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
24e20 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
24e30 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
24e40 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
24e50 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
24e60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
24e70 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
24e80 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
24e90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24ea0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
24eb0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
24ec0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
24ed0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
24ee0 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
24ef0 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
24f00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
24f10 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
24f20 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
24f30 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
24f40 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
24f50 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
24f60 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
24f70 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
24f80 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
24f90 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
24fa0 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
24fb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
24fc0 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
24fd0 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
24fe0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
24ff0 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
25000 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
25010 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
25020 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
25030 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
25040 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
25050 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
25060 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
25070 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
25080 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
25090 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
250a0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
250b0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
250c0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
250d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
250e0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
250f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
25100 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25110 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
25120 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
25130 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
25140 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
25150 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
25160 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
25170 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
25180 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
25190 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
251a0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
251b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
251c0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
251d0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62  zDbSName;.  pTab
251e0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
251f0 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
25200 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
25210 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
25220 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
25230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
25240 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
25250 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
25260 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
25270 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
25280 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
25290 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
252a0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
252b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
252c0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
252d0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
252e0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
252f0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
25300 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
25310 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
25320 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25330 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
25340 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
25350 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
25360 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
25370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65  *.** Return a Ke
25380 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
25390 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
253a0 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
253b0 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  n Index..**.** T
253c0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
253d0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
253e0 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
253f0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
25400 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
25410 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
25420 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
25430 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
25440 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
25450 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
25460 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
25470 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
25480 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
25490 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
254a0 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
254b0 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
254c0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
254d0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
254e0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
254f0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
25500 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
25510 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
25520 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
25530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
25540 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
25550 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
25560 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
25570 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
25580 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
25590 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
255a0 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
255b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
255c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
255d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
255e0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
255f0 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
25600 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
25610 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
25620 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
25630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25640 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
25650 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
25660 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
25670 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
25680 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
25690 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
256a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
256b0 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
256c0 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  t( pParse->rc==S
256d0 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53  QLITE_ERROR_MISS
256e0 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20  ING_COLLSEQ );. 
256f0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
25700 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20  NoQuery==0 ){.  
25710 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76        /* Deactiv
25720 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 62 65  ate the index be
25730 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e  cause it contain
25740 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c  s an unknown col
25750 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  lating.        *
25760 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65  * sequence.  The
25770 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61   only way to rea
25780 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
25790 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65  is to reload the
257a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65  .        ** sche
257b0 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20  ma.  Adding the 
257c0 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e  missing collatin
257d0 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72  g sequence later
257e0 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
257f0 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68    ** reactive th
25800 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70  e index.  The ap
25810 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68  plication had th
25820 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69  e chance to regi
25830 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ster.        ** 
25840 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65  the missing inde
25850 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  x using the coll
25860 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
25870 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20  lback.  For.    
25880 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74      ** simplicit
25890 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  y, SQLite will n
258a0 6f 74 20 67 69 76 65 20 74 68 65 20 61 70 70 6c  ot give the appl
258b0 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  ication a second
258c0 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20   chance..       
258d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78   */.        pIdx
258e0 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a  ->bNoQuery = 1;.
258f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
25900 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
25910 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d  R_RETRY;.      }
25920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
25930 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
25940 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30  ;.      pKey = 0
25950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25960 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69  turn pKey;.}..#i
25970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25980 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  T_CTE./* .** Thi
25990 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
259a0 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54  oked once per CT
259b0 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  E by the parser 
259c0 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20  while parsing a 
259d0 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e  .** WITH clause.
259e0 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74   .*/.With *sqlit
259f0 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72  e3WithAdd(.  Par
25a00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
25a10 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
25a20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74  context */.  Wit
25a30 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
25a40 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
25a50 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72   WITH clause, or
25a60 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
25a70 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
25a80 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
25a90 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a  e common-table *
25aa0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
25ab0 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f  rglist,     /* O
25ac0 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e  ptional column n
25ad0 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65  ame list for the
25ae0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
25af0 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20  ct *pQuery      
25b00 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65      /* Query use
25b10 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
25b20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
25b30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25b40 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69  pParse->db;.  Wi
25b50 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72  th *pNew;.  char
25b60 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43   *zName;..  /* C
25b70 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54  heck that the CT
25b80 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  E name is unique
25b90 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54   within this WIT
25ba0 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a  H clause. If.  *
25bb0 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20  * not, store an 
25bc0 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
25bd0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  se structure. */
25be0 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
25bf0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
25c00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
25c10 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
25c20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  && pWith ){.    
25c30 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
25c40 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
25c50 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
25c60 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
25c70 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e  p(zName, pWith->
25c80 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
25c90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25ca0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
25cb0 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54  , "duplicate WIT
25cc0 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73  H table name: %s
25cd0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
25ce0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
25cf0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
25d00 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
25d10 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73  eof(*pWith) + (s
25d20 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31  izeof(pWith->a[1
25d30 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65  ]) * pWith->nCte
25d40 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  );.    pNew = sq
25d50 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
25d60 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29  b, pWith, nByte)
25d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
25d80 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
25d90 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
25da0 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20  zeof(*pWith));. 
25db0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e   }.  assert( (pN
25dc0 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21 3d  ew!=0 && zName!=
25dd0 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
25de0 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66 28  Failed );..  if(
25df0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25e00 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
25e10 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
25e20 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20  b, pArglist);.  
25e30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
25e40 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79  elete(db, pQuery
25e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
25e60 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
25e70 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74  .    pNew = pWit
25e80 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
25e90 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
25ea0 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51  te].pSelect = pQ
25eb0 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  uery;.    pNew->
25ec0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43  a[pNew->nCte].pC
25ed0 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a  ols = pArglist;.
25ee0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25ef0 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20  ->nCte].zName = 
25f00 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d  zName;.    pNew-
25f10 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
25f20 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
25f30 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20  pNew->nCte++;.  
25f40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  }..  return pNew
25f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
25f60 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25f70 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
25f80 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
25f90 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
25fa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
25fb0 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  thDelete(sqlite3
25fc0 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74   *db, With *pWit
25fd0 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20  h){.  if( pWith 
25fe0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
25ff0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
26000 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
26010 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65        struct Cte
26020 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d   *pCte = &pWith-
26030 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
26040 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26050 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f  te(db, pCte->pCo
26060 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ls);.      sqlit
26070 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
26080 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
26090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
260a0 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d  DbFree(db, pCte-
260b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
260c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
260d0 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d  (db, pWith);.  }
260e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
260f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26100 54 5f 43 54 45 29 20 2a 2f 0a                    T_CTE) */.