/ Hex Artifact Content
Login

Artifact 9cc3ee9b5736ad53a2f1667e7e7bc69bcdacb6ed6419006b26421e969bc0b696:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2e80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
2e90: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
2ea0: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20  base)<1 ){.     
2eb0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2ec0: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2ed0: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2ee0: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2ef0: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  d using.      **
2f00: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68   CREATE, then ch
2f10: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2f20: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2f30: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  an virtual table
2f40: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
2f50: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
2f60: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
2f70: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c  . */.      Modul
2f80: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2f90: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2fa0: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
2fb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
2fc0: 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71  f( pMod==0 && sq
2fd0: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2fe0: 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c  Name, "pragma_",
2ff0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   7)==0 ){.      
3000: 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65 33    pMod = sqlite3
3010: 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74  PragmaVtabRegist
3020: 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  er(db, zName);. 
3030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3040: 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74 65 33   pMod && sqlite3
3050: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
3060: 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  leInit(pParse, p
3070: 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Mod) ){.        
3080: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70  return pMod->pEp
3090: 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oTab;.      }.  
30a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
30b0: 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41  f( (flags & LOCA
30c0: 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a  TE_NOERR)==0 ){.
30d0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 61 73 65        if( zDbase
30e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3100: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3110: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
3130: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3140: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3150: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
3160: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
3170: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
3180: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
3190: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
31a0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
31b0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  ** Locate the ta
31c0: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
31d0: 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y *p..**.** This
31e0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
31f0: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61  ound sqlite3Loca
3200: 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64  teTable(). The d
3210: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
3220: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61  n.** sqlite3Loca
3230: 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68  teTable() and th
3240: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
3250: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
3260: 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74  n restricts.** t
3270: 68 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68  he search to sch
3280: 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29  ema (p->pSchema)
3290: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
32a0: 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d  LL. p->pSchema m
32b0: 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c  ay be.** non-NUL
32c0: 4c 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20  L if it is part 
32d0: 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69  of a view or tri
32e0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66  gger program def
32f0: 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20  inition. See.** 
3300: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
3310: 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  t() for details.
3320: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
3330: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
3340: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
3350: 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73  se, .  u32 flags
3360: 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ,.  struct SrcLi
3370: 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20  st_item *p.){.  
3380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
3390: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
33a0: 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  chema==0 || p->z
33b0: 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20  Database==0 );. 
33c0: 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20   if( p->pSchema 
33d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
33e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
33f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
3400: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
3410: 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d     zDb = pParse-
3420: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
3430: 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  bSName;.  }else{
3440: 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44  .    zDb = p->zD
3450: 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72  atabase;.  }.  r
3460: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63  eturn sqlite3Loc
3470: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
3480: 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65   flags, p->zName
3490: 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , zDb);.}../*.**
34a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
34b0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
34c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
34d0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
34e0: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
34f0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
3500: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
3510: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3520: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
3530: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
3540: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
3550: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
3560: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
3570: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
3580: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
3590: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
35a0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
35b0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
35c0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
35d0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
35e0: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
35f0: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
3600: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
3610: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
3620: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
3630: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
3640: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
3650: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
3660: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
3670: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
3680: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
3690: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
36a0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
36b0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
36c0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
36d0: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ;.  /* All mutex
36e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
36f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
3700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
3710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
3720: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
3730: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
3740: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
3750: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
3760: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
3770: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3780: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
3790: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
37a0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
37b0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
37c0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
37d0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
37e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
37f0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
3800: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
3810: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
3820: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
3830: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3850: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3860: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3870: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3880: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3890: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
38a0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
38b0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
38c0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
38d0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
38e0: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
38f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
3900: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
3910: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
3920: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3930: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
3940: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
3950: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3960: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3970: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3980: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
39a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
39b0: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
39c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
39d0: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
39e0: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
39f0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
3a00: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
3a10: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
3a20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3a30: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
3a40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
3a50: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
3a60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3a70: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3a80: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3a90: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3aa0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3ab0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3ac0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3ad0: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3ae0: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3af0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
3b00: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
3b10: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
3b20: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
3b30: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3b40: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
3b50: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
3b60: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3b70: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3b80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3ba0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3bb0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3bc0: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3bd0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3be0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3bf0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3c00: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3c10: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3c20: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3c30: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3c40: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3c50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3c60: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3c70: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3c80: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3c90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3ca0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3cb0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3cc0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3cd0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3ce0: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3cf0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3d00: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3d10: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3d20: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3d30: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3d40: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3d50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3d60: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3d70: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3d80: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3d90: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3da0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3db0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3dc0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3dd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3de0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3df0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3e00: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
3e10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
3e20: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
3e30: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
3e40: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  ge;.}../*.** Loo
3e50: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69  k through the li
3e60: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62  st of open datab
3e70: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d  ase files in db-
3e80: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a  >aDb[] and if.**
3e90: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63   any have been c
3ea0: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68  losed, remove th
3eb0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  em from the list
3ec0: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Reallocate th
3ed0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73  e.** db->aDb[] s
3ee0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d  tructure to a sm
3ef0: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70  aller size, if p
3f00: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45  ossible..**.** E
3f10: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69  ntry 0 (the "mai
3f20: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64  n" database) and
3f30: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74   entry 1 (the "t
3f40: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a  emp" database).*
3f50: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64  * are never cand
3f60: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67  idates for being
3f70: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76   collapsed..*/.v
3f80: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  oid sqlite3Colla
3f90: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
3fa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3fb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
3fc0: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
3fd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
3fe0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
3ff0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4000: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
4010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4020: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a  bFree(db, pDb->z
4030: 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  DbSName);.      
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20  pDb->zDbSName = 
4050: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
4060: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
4070: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
4080: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
4090: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
40a0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
40b0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
40c0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
40d0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
40e0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
40f0: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
4100: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
4110: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
4120: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4130: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
4140: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
4150: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
4160: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4170: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4180: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4190: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
41a0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
41b0: 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20  MP schema.  The 
41c0: 72 65 73 65 74 20 69 73 20 64 65 66 65 72 72 65  reset is deferre
41d0: 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61  d if db->nSchema
41e0: 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f  Lock is not zero
41f0: 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65  ..** Deferred re
4200: 73 65 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20  sets may be run 
4210: 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20  by calling with 
4220: 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  iDb<0..*/.void s
4230: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
4240: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
4250: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
4260: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t i;.  assert( i
4270: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
4280: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
4290: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
42a0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
42b0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
42c0: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
42d0: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52  ty(db, iDb, DB_R
42e0: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
42f0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
4300: 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61  b, 1, DB_ResetWa
4310: 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  nted);.    db->m
4320: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4330: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4340: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
4350: 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29  nSchemaLock==0 )
4360: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4370: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4380: 20 20 20 20 20 20 69 66 28 20 44 62 48 61 73 50        if( DbHasP
4390: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
43a0: 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20 29  B_ResetWanted) )
43b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
43c0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
43d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
43e0: 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  ar(db->aDb[1].pS
43f0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
4400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4410: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 55 6e   sqlite3SchemaUn
4420: 75 73 65 28 64 62 2c 20 69 29 3b 0a 20 20 20 20  use(db, i);.    
4430: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4440: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4450: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
4460: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
4470: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
4480: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
4490: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
44a0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
44b0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
44c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
44d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
44e0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
44f0: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
4500: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4510: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
4520: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 61 73 73  erAll(db);.  ass
4530: 65 72 74 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61  ert( db->nSchema
4540: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  Lock==0 );.  for
4550: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4560: 20 69 3d 28 69 3f 69 2b 31 3a 32 29 29 7b 0a 20   i=(i?i+1:2)){. 
4570: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
4580: 55 6e 75 73 65 28 64 62 2c 20 69 29 3b 0a 20 20  Unuse(db, i);.  
4590: 7d 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  }.  sqlite3Schem
45a0: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31  aClear(db->aDb[1
45b0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 62  ].pSchema);.  db
45c0: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 28  ->mDbFlags &= ~(
45d0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
45e0: 6e 67 65 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d  nge|DBFLAG_Schem
45f0: 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c  aKnownOk);.  sql
4600: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
4610: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
4620: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
4630: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
4640: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
4650: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
4660: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4670: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
4680: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
4690: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
46a0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
46b0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
46c0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
46d0: 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d  &= ~DBFLAG_Schem
46e0: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
46f0: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4700: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4710: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4720: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4730: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4740: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4750: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4760: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4770: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4780: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
4790: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
47a0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
47b0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
47c0: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
47d0: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
47e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
47f0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
4800: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
4810: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4820: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
4830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4840: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
4850: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
4860: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4870: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4880: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4890: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
48a0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
48b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
48c0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
48d0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
48e0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
48f0: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4900: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4910: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4920: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
4930: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
4940: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4950: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4960: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4970: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4980: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4990: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
49a0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
49b0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
49c0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
49d0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
49e0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
49f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4a00: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4a10: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4a20: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
4a30: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
4a40: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4a50: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4a60: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4a70: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4a80: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4a90: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4aa0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4ab0: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4ac0: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4ad0: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4ae0: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4af0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4b00: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4b10: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4b20: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
4b30: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
4b40: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4b50: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
4b60: 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73  NE deleteTable(s
4b70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4b80: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4b90: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4ba0: 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ext;..#ifdef SQL
4bb0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52  ITE_DEBUG.  /* R
4bc0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4bd0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4be0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4bf0: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4c00: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4c10: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4c20: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4c30: 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20  .  Since schema 
4c40: 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73  Tables do not us
4c50: 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  e.  ** lookaside
4c60: 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68  , this number sh
4c70: 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e  ould not change.
4c80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
4c90: 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  side = 0;.  if( 
4ca0: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
4cb0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4cc0: 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
4cd0: 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73    nLookaside = s
4ce0: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
4cf0: 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  sed(db, 0);.  }.
4d00: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c  #endif..  /* Del
4d10: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
4d20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4d30: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
4d40: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
4d50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
4d60: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
4d70: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
4d80: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
4d90: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
4da0: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
4db0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20  ble->pSchema.   
4dc0: 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72 74        || (IsVirt
4dd0: 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20 70  ual(pTable) && p
4de0: 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
4df0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
4e00: 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69 66  PPDEF) );.    if
4e10: 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ( (db==0 || db->
4e20: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29  pnBytesFreed==0)
4e30: 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
4e40: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
4e50: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49  char *zName = pI
4e60: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20  ndex->zName; .  
4e70: 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49      TESTONLY ( I
4e80: 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73  ndex *pOld = ) s
4e90: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4ea0: 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64  (.         &pInd
4eb0: 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
4ec0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20  Hash, zName, 0. 
4ed0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
4ee0: 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73  sert( db==0 || s
4ef0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4f00: 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
4f10: 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
4f20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4f30: 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70  Old==pIndex || p
4f40: 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Old==0 );.    }.
4f50: 20 20 20 20 73 71 6c 69 74 65 33 46 72 65 65 49      sqlite3FreeI
4f60: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
4f70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
4f80: 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b  te any foreign k
4f90: 65 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  eys attached to 
4fa0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
4fb0: 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65   sqlite3FkDelete
4fc0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20  (db, pTable);.. 
4fd0: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
4fe0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
4ff0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
5000: 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d  lite3DeleteColum
5010: 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c  nNames(db, pTabl
5020: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
5030: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
5040: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5050: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
5060: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
5070: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5080: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
5090: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
50a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
50b0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
50c0: 68 65 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53  heck);.#ifndef S
50d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
50e0: 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
50f0: 33 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70  3VtabClear(db, p
5100: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  Table);.#endif. 
5110: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5120: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  b, pTable);..  /
5130: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f  * Verify that no
5140: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
5150: 79 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63  y was used by sc
5160: 68 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20  hema tables */. 
5170: 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73   assert( nLookas
5180: 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61  ide==0 || nLooka
5190: 73 69 64 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f  side==sqlite3Loo
51a0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
51b0: 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   );.}.void sqlit
51c0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
51d0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
51e0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20   *pTable){.  /* 
51f0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
5200: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
5210: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
5220: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
5230: 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65  */.  if( !pTable
5240: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
5250: 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e   ((!db || db->pn
5260: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26  BytesFreed==0) &
5270: 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61  & (--pTable->nTa
5280: 62 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72  bRef)>0) ) retur
5290: 6e 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c 65  n;.  deleteTable
52a0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a  (db, pTable);.}.
52b0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
52c0: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66  he given table f
52d0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
52e0: 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65  les and the dele
52f0: 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  te the.** table 
5300: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 61  structure with a
5310: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
5320: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e  nd foreign keys.
5330: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5340: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54  UnlinkAndDeleteT
5350: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
5360: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
5370: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29   char *zTabName)
5380: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5390: 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
53a0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61  rt( db!=0 );.  a
53b0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
53c0: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
53d0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61    assert( zTabNa
53e0: 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
53f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
5400: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
5410: 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  0) );.  testcase
5420: 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  ( zTabName[0]==0
5430: 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e   );  /* Zero-len
5440: 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  gth table names 
5450: 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  are allowed */. 
5460: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
5470: 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69  iDb];.  p = sqli
5480: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
5490: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
54a0: 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Hash, zTabName, 
54b0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  0);.  sqlite3Del
54c0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
54d0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
54e0: 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
54f0: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
5500: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
5510: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
5520: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
5530: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
5540: 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61  t.** token.  Spa
5550: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
5560: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
5570: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
5580: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
5590: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
55a0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
55b0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
55c0: 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74  **.** Any quotat
55d0: 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20  ion marks (ex:  
55e0: 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20  "name", 'name', 
55f0: 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65  [name], or `name
5600: 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f  `) that.** surro
5610: 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20  und the body of 
5620: 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65  the token are re
5630: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  moved..**.** Tok
5640: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
5650: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
5660: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
5670: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
5680: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
56a0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
56b0: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
56c0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
56d0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
56e0: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
56f0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
5700: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
5710: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
5720: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
5730: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
5740: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
5750: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
5760: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
5770: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
5780: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
5790: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
57a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
57b0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
57c0: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
57d0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
57e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
57f0: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
5800: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
5810: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
5820: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
5830: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
5840: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
5850: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
5860: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
5870: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
5880: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5890: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
58a0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
58b0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
58c0: 4d 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20  MASTER_NAME);.  
58d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
58e0: 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  4Int(v, OP_OpenW
58f0: 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f  rite, 0, MASTER_
5900: 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20  ROOT, iDb, 5);. 
5910: 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20   if( p->nTab==0 
5920: 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d  ){.    p->nTab =
5930: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
5940: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
5950: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
5960: 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66  -terminated buff
5970: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
5980: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64  e name.** of a d
5990: 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c  atabase ("main",
59a0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
59b0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
59c0: 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20  ed db). This.** 
59d0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
59e0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
59f0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5a00: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5a10: 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e  r.** -1 if the n
5a20: 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62  amed db cannot b
5a30: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
5a40: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5a50: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
5a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5a70: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5a90: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5aa0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
5ab0: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 66    Db *pDb;.    f
5ac0: 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29  or(i=(db->nDb-1)
5ad0: 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69  , pDb=&db->aDb[i
5ae0: 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44  ]; i>=0; i--, pD
5af0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b--){.      if( 
5b00: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
5b10: 6d 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  mp(pDb->zDbSName
5b20: 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b  , zName) ) break
5b30: 3b 0a 20 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e  ;.      /* "main
5b40: 22 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20 61  " is always an a
5b50: 63 63 65 70 74 61 62 6c 65 20 61 6c 69 61 73 20  cceptable alias 
5b60: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
5b70: 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
5b80: 2a 20 65 76 65 6e 20 69 66 20 69 74 20 68 61 73  * even if it has
5b90: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 75 73   been renamed us
5ba0: 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ing SQLITE_DBCON
5bb0: 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20  FIG_MAINDBNAME. 
5bc0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  */.      if( i==
5bd0: 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f  0 && 0==sqlite3_
5be0: 73 74 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20  stricmp("main", 
5bf0: 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a  zName) ) break;.
5c00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5c10: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn i;.}../*.** T
5c20: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
5c30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
5c40: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
5c50: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
5c60: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
5c70: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
5c80: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
5c90: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5ca0: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
5cb0: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
5cc0: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
5cd0: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
5ce0: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
5cf0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
5d00: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
5d10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
5d20: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
5d30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5d60: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
5d70: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
5da0: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
5db0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
5dc0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5dd0: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20  db, pName);.  i 
5de0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
5df0: 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ame(db, zName);.
5e00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5e10: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
5e20: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn i;.}../* Th
5e30: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5e40: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
5e50: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
5e60: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
5e70: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
5e80: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5e90: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5ea0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5eb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
5ec0: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5ed0: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
5ee0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
5ef0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
5f00: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
5f10: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
5f20: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
5f30: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
5f40: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
5f50: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
5f60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
5f70: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
5f80: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5f90: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5fa0: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
5fb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
5fc0: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
5fd0: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
5fe0: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
5ff0: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
6000: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
6010: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
6020: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
6030: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
6040: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
6050: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
6060: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
6070: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
6080: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6090: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
60a0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
60b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
60c0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
60d0: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
60e0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
60f0: 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20  y" or "xxx" */. 
6100: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6110: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79       /* The "yyy
6120: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
6130: 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b  xx.yyy" */.  Tok
6140: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20  en **pUnqual    
6150: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e   /* Write the un
6160: 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74  qualified object
6170: 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b   name here */.){
6180: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61a0: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
61b0: 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f  ng the object */
61c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
61d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
61e0: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21 3d  assert( pName2!=
61f0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  0 );.  if( pName
6200: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  2->n>0 ){.    if
6210: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
6220: 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ) {.      sqlite
6230: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6240: 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62  , "corrupt datab
6250: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ase");.      ret
6260: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
6270: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
6280: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
6290: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
62a0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
62b0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
62c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
62d0: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
62e0: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
62f0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72  pName1);.      r
6300: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
6310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6320: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
6330: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
6340: 2e 62 75 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41  .busy || IN_RENA
6350: 4d 45 5f 4f 42 4a 45 43 54 0a 20 20 20 20 20 20  ME_OBJECT.      
6360: 20 20 20 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d         || (db->m
6370: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
6380: 5f 56 61 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20  _Vacuum)!=0);.  
6390: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
63a0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
63b0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
63c0: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
63d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
63e0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
63f0: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
6400: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
6410: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
6420: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
6430: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
6440: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
6450: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
6460: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
6470: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
6480: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
6490: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
64a0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
64b0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
64c0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
64d0: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
64e0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
64f0: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
6500: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6510: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6520: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6530: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6550: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
6560: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
6570: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
6580: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
6590: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
65a0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
65b0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
65c0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
65d0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
65e0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
65f0: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6600: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6610: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6620: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
6630: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
6640: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
6650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6660: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
6670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6680: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
6690: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
66a0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
66b0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
66c0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
66d0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
66e0: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
66f0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6700: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6710: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6720: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
6730: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6740: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
6750: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
6760: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
6770: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
6780: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
6790: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
67a0: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
67b0: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
67c0: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
67d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
67e0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
67f0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6800: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6810: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6820: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6830: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6840: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6850: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6860: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6870: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
6880: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
6890: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
68a0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
68b0: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
68c0: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
68d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
68e0: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
68f0: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6900: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6910: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6920: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6930: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6940: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6950: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6960: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6970: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
6980: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
6990: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
69a0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
69b0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
69c0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
69d0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
69e0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
69f0: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6a00: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6a10: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6a20: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6a30: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6a40: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6a50: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6a60: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6a70: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
6a80: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
6a90: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6aa0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6ab0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6ac0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6ad0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6ae0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6af0: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6b00: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6b10: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6b20: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6b30: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6b40: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6b50: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6b60: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6b70: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6b80: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
6b90: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
6ba0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6bb0: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6bc0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6bd0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6be0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6bf0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6c00: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6c10: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6c20: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6c30: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6c40: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6c50: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6c60: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6c70: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6c80: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6c90: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
6ca0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6cb0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6cc0: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6cd0: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6ce0: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6cf0: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6d00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6d10: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6d20: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6d30: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6d40: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6d50: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6d60: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6d70: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6d80: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
6d90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6da0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
6db0: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
6dc0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6dd0: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
6de0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
6df0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6e00: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
6e10: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
6e20: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
6e30: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
6e40: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
6e50: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
6e60: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
6e70: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
6e80: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
6e90: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
6ea0: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
6eb0: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
6ec0: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
6ed0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
6ee0: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
6ef0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
6f00: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
6f10: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
6f20: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
6f30: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
6f40: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
6f50: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
6f60: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
6f70: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
6f80: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
6f90: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6fa0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
6fb0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
6fc0: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
6fd0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6fe0: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
6ff0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
7000: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
7010: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
7020: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
7030: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
7040: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
7050: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7060: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
7070: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
7080: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
7090: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
70a0: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
70b0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
70c0: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
70d0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
70e0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
70f0: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
7100: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
7110: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
7120: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
7130: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
7140: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
7150: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
7160: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
7170: 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e  *pName;.  if( zN
7180: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
7190: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
71a0: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
71b0: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
71c0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
71d0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
71e0: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
71f0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
7200: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
7210: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7220: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
7230: 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d  .  assert( isTem
7240: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
7250: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
7260: 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
7270: 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20  ew==1 );.  {.   
7280: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7290: 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   aCode[] = {.   
72a0: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
72b0: 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  E_TABLE,.       
72c0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
72d0: 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  MP_TABLE,.      
72e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
72f0: 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  IEW,.       SQLI
7300: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7310: 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  IEW.    };.    c
7320: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7330: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
7340: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
7350: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
7360: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
7370: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
7380: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
7390: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
73a0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
73b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
73c0: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
73d0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
73e0: 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65  arse, (int)aCode
73f0: 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77  [isTemp+2*isView
7400: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
7430: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
7440: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7450: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7460: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
7470: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
7480: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
7490: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
74a0: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
74b0: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
74c0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
74d0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
74e0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
74f0: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
7500: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
7510: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
7520: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
7530: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
7540: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
7550: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
7560: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
7570: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
7580: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
7590: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
75a0: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
75b0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
75c0: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
75d0: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
75e0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
75f0: 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
7600: 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  E ){.    char *z
7610: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7620: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
7630: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7640: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
7650: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
7660: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7670: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7680: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
7690: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
76a0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
76b0: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
76c0: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
76d0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
76e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
76f0: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
7700: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
7710: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
7720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7730: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
7740: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
7750: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
7760: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
7770: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
7780: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7790: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
77a0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
77b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
77c0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
77d0: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
77e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
77f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7800: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
7810: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
7820: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
7830: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7840: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7850: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
7860: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7870: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
7880: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
7890: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
78a0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
78b0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
78c0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
78d0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
78e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
78f0: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
7900: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
7910: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
7920: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
7930: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
7940: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
7950: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
7960: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7970: 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  le->nTabRef = 1;
7980: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7990: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20  EFAULT_ROWEST.  
79a0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
79b0: 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
79c0: 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  st(SQLITE_DEFAUL
79d0: 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65  T_ROWEST);.#else
79e0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
79f0: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7a00: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7a10: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
7a20: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
7a30: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
7a40: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7a50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7a60: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7a70: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7a80: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7a90: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7aa0: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7ab0: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7ac0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7ad0: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7ae0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7af0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
7b00: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
7b10: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
7b20: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
7b30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7b40: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7b50: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7b60: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7b70: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7b80: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7b90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7ba0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7bb0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7bc0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7bd0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7be0: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
7bf0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
7c00: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
7c10: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
7c20: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
7c30: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
7c40: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7c50: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7c60: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7c70: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7c80: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7c90: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7ca0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7cb0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
7cc0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
7cd0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
7ce0: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
7cf0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
7d00: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
7d10: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
7d20: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
7d30: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
7d40: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
7d50: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
7d60: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7d70: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7d80: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7d90: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
7da0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
7db0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
7dc0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
7dd0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
7de0: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
7df0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
7e00: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
7e10: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
7e20: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
7e30: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
7e40: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
7e50: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
7e60: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
7e70: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
7e80: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
7e90: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
7ea0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
7eb0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
7ec0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
7ed0: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
7ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ef0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
7f00: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
7f10: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
7f20: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
7f30: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
7f40: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
7f50: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
7f60: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
7f70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7f80: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
7f90: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
7fa0: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
7fb0: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
7fc0: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
7fd0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
7fe0: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
7ff0: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
8000: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8010: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
8020: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
8030: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8040: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
8050: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
8060: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
8070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
8080: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
8090: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
80a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
80b0: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
80c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
80d0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
80e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
80f0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
8100: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
8110: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
8120: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
8130: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
8140: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8150: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8160: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
8170: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
8180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8190: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
81a0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
81b0: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
81c0: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
81d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
81e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
81f0: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
8200: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
8210: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
8220: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
8230: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
8240: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
8250: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
8260: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
8270: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
8280: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
8290: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
82a0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
82b0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
82c0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
82d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
82e0: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
82f0: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
8300: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
8310: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
8320: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
8330: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
8340: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
8350: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
8360: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
8370: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
8380: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
8390: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
83a0: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
83b0: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
83c0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
83d0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
83e0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
83f0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8400: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8410: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8420: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
8430: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
8440: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8450: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8460: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
8470: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
8480: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
8490: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
84a0: 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71  ab =.         sq
84b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
84c0: 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
84d0: 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54  e, iDb, reg2, BT
84e0: 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20  REE_INTKEY);.   
84f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
8500: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
8510: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8530: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
8540: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
8550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8560: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
8570: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
8580: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
8590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
85a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
85b0: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
85c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
85d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
85e0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
85f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8600: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
8610: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
8620: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
8630: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
8640: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
8650: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
8660: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
8670: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
8680: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8690: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
86a0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
86b0: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
86c0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
86d0: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
86e0: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
86f0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
8700: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8710: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
8720: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
8730: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
8740: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
8750: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
8760: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
8770: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
8780: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
8790: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
87a0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
87b0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
87c0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
87d0: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
87e0: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
87f0: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
8800: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
8810: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
8820: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
8830: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
8840: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8850: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8860: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8870: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8880: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8890: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
88a0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
88b0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
88c0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
88d0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
88e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
88f0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8900: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8910: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8920: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8930: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8940: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8950: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8960: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8970: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8980: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8990: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
89a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
89b0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
89c0: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
89d0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
89e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
89f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8a00: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8a10: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8a20: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
8a30: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8a40: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8a50: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8a60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8a70: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8a80: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8a90: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8aa0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
8ab0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8ac0: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8ad0: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
8ae0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8af0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f  eturn;.  if( IN_
8b00: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20  RENAME_OBJECT ) 
8b10: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
8b20: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
8b30: 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a  oid*)z, pName);.
8b40: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8b50: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8b60: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8b70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8b80: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8b90: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8ba0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8bb0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8bc0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8bd0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8be0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8bf0: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8c00: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8c10: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8c20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8c30: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8c40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8c50: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8c60: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8c70: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8c80: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8c90: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8ca0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8cb0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8cc0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8cd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8d00: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8d10: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8d20: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8d30: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8d40: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8d50: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8d60: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8d70: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8d80: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8d90: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
8da0: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
8db0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
8dc0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8dd0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8de0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8df0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
8e00: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
8e10: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
8e20: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
8e30: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8e40: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
8e50: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
8e60: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
8e70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
8e80: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
8e90: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
8ea0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
8eb0: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
8ec0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8ed0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
8ee0: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
8ef0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
8f00: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
8f10: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8f20: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
8f30: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
8f40: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
8f50: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
8f60: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
8f70: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
8f80: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
8f90: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8fa0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
8fb0: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
8fc0: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8fd0: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
8fe0: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
8ff0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
9000: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
9010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9020: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9030: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
9040: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
9050: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
9060: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
9070: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
9080: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
9090: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
90a0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
90b0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
90c0: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
90d0: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
90e0: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
90f0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9100: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9110: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9130: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
9140: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9150: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
9160: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9170: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9180: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
91a0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
91b0: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
91c0: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
91d0: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
91e0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
91f0: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9200: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9210: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9220: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
9230: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
9240: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
9250: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
9260: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9270: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
9280: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9290: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
92a0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
92b0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
92c0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
92d0: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
92e0: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
92f0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9300: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9310: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9320: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
9330: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
9340: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
9350: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
9360: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
9370: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
9380: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
9390: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
93a0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
93b0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
93c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
93d0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
93e0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
93f0: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9400: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9410: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9420: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
9430: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9440: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
9450: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9460: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
9470: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
9480: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
9490: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
94a0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
94b0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
94c0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
94d0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
94e0: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
94f0: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9500: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9510: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9520: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
9530: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
9540: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9570: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
9580: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
9590: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
95a0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
95b0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
95c0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
95d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
95e0: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
95f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9600: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9610: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9620: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
9630: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9640: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
9650: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9660: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
9670: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
9680: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
9690: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
96a0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
96b0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
96c0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
96d0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
96e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
96f0: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9700: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9710: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9720: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
9730: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9740: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9750: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
9760: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
9770: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
9780: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9790: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
97a0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
97b0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
97c0: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
97d0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
97e0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
97f0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9800: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9810: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9820: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9830: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9840: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9850: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9860: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9870: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9880: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9890: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
98a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
98b0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
98c0: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
98d0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
98e0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
98f0: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9900: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9910: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9920: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9930: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9940: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9950: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9960: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9970: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9980: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9990: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
99a0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
99b0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
99c0: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
99d0: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
99e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
99f0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9a00: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9a10: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9a20: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9a30: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9a40: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9a50: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9a60: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9a70: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9a80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9a90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9aa0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9ab0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9ac0: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9ad0: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9ae0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9af0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9b00: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9b10: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9b20: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9b30: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9b40: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9b50: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9b60: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9b70: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9b80: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9b90: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9ba0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9bb0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9bc0: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9bd0: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9be0: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9bf0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9c00: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9c10: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9c20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9c30: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9c40: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9c50: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9c60: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9c70: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9c80: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9c90: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9ca0: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9cb0: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9cc0: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9cd0: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9ce0: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9cf0: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9d00: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9d10: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9d20: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9d30: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9d40: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9d50: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9d60: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9d80: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9d90: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9da0: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
9db0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
9dc0: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
9dd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
9de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9df0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
9e00: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
9e10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9e20: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
9e30: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9e40: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9e50: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9e60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
9e70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9e80: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
9e90: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
9ea0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
9eb0: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
9ec0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
9ed0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
9ee0: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
9ef0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
9f00: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
9f10: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9f20: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
9f30: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
9f40: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
9f50: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
9f60: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
9f70: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
9f80: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9f90: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
9fa0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9fb0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9fc0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
9fd0: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
9fe0: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
9ff0: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
a000: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
a010: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
a020: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
a030: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a040: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
a050: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
a060: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
a070: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
a080: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a090: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a0a0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
a0b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a0c0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a0d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a0e0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a100: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a110: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a120: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a140: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a150: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a160: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a180: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a190: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a1a0: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a1b0: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a1c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a1d0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a1e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a1f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a200: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a210: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a220: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a230: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a240: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a250: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a260: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a270: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a280: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a290: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a2a0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a2b0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a2c0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a2d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a2e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a300: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a310: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a320: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a330: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a340: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a350: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a360: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a370: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a380: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a390: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a3a0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a3b0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a3c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a3d0: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a3e0: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a3f0: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a400: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a410: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a420: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a430: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a440: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a450: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a460: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a470: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a480: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a490: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a4a0: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a4b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49     }.  }.  if( I
a4c0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
a4d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
a4e0: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
a4f0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
a500: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
a510: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
a520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
a530: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
a540: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
a550: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
a560: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
a570: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
a580: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
a590: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
a5a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
a5b0: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
a5c0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
a5d0: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
a5e0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
a5f0: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
a600: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
a610: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
a620: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
a630: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
a640: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
a650: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
a660: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
a670: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
a680: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
a690: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
a6a0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
a6b0: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
a6c0: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
a6d0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a6e0: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
a6f0: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
a700: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
a710: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
a720: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
a730: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
a740: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
a750: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
a760: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
a770: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
a780: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
a790: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
a7a0: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
a7b0: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
a7c0: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
a7d0: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
a7e0: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
a7f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a800: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
a810: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
a820: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
a830: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
a840: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
a850: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
a860: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
a870: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
a880: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
a890: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
a8a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
a8b0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
a8c0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
a8d0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
a8e0: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
a8f0: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
a900: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
a910: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
a920: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
a930: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
a940: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
a950: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
a960: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
a970: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
a980: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
a990: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
a9a0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
a9b0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
a9c0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
a9d0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
a9e0: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
a9f0: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
aa00: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
aa10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
aa20: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
aa30: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
aa40: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
aa50: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
aa60: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
aa70: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
aa80: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
aa90: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
aaa0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
aab0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
aac0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
aad0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
aae0: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
aaf0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
ab00: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
ab10: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
ab20: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
ab30: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ab40: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
ab50: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
ab60: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ab70: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
ab80: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
ab90: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
aba0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
abb0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
abc0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
abd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
abe0: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
abf0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
ac00: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ac10: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ac20: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
ac30: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
ac40: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
ac50: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
ac60: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
ac70: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
ac80: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
ac90: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
aca0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
acb0: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
acc0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
acd0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
ace0: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
acf0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
ad00: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
ad10: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
ad20: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
ad30: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
ad40: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
ad50: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
ad60: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
ad70: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
ad80: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
ad90: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
ada0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
adb0: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
adc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
add0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
ade0: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
adf0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
ae00: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
ae10: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ae20: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
ae30: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
ae40: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
ae50: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
ae60: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
ae70: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
ae80: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
ae90: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
aea0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
aeb0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
aec0: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
aed0: 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  KEY;.    nTerm =
aee0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
aef0: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
af00: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
af10: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
af20: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
af30: 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
af40: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
af50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
af60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
af70: 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20   pCExpr!=0 );.  
af80: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
af90: 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20  gToId(pCExpr);. 
afa0: 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d       if( pCExpr-
afb0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
afc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
afd0: 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70   *zCName = pCExp
afe0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
aff0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
b000: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b010: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
b020: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b030: 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20  StrICmp(zCName, 
b040: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b050: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
b060: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
b070: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
b080: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l];.            
b090: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b0a0: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b0b0: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  Y;.            b
b0c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b0d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b0e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b0f0: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
b100: 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71  && pCol.   && sq
b110: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c  lite3StrICmp(sql
b120: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
b130: 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45  Col,""), "INTEGE
b140: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
b150: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
b160: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
b170: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
b180: 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  JECT && pList ){
b190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b1a0: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
b1b0: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
b1c0: 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Key, pList->a[0]
b1d0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
b1e0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
b1f0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
b200: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
b210: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
b220: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
b230: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
b240: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
b250: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
b260: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
b270: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
b280: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
b290: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
b2a0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
b2b0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
b2c0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
b2d0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b2e0: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
b2f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b300: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
b310: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
b320: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
b330: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
b340: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
b350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b360: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
b370: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
b380: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
b390: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b3b0: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
b3c0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
b3d0: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
b3e0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
b3f0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b400: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
b410: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b420: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
b430: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b440: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
b450: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
b460: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
b470: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
b480: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
b490: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
b4a0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
b4b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b4c0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b4d0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
b4e0: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
b4f0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
b500: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b510: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b520: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b530: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b540: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b550: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b560: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
b570: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
b580: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b590: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b5a0: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b5b0: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b5c0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b5d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b5e0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b5f0: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b600: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b610: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b620: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b630: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b640: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b650: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b660: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b670: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b680: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b690: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b6a0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
b6b0: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
b6c0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b6d0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
b6e0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
b6f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b700: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
b710: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
b720: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
b730: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b740: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
b750: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
b760: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
b770: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
b780: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
b790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b7a0: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
b7b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b7c0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
b7d0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
b7e0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b7f0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
b800: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
b810: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
b820: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
b830: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
b840: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
b850: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
b860: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
b870: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b880: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
b890: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
b8a0: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
b8b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
b8c0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
b8d0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
b8e0: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
b8f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
b900: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
b910: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
b920: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
b930: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
b940: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
b950: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
b960: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
b970: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
b980: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
b990: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
b9a0: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
b9b0: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
b9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
b9d0: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
b9e0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
b9f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
ba00: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
ba10: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
ba20: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
ba30: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
ba40: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ba50: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
ba60: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
ba70: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ba80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ba90: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
baa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bab0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
bac0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
bad0: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
bae0: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
baf0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
bb00: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
bb10: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
bb20: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
bb30: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
bb40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bb50: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
bb60: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
bb70: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
bb80: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
bb90: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
bba0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
bbb0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
bbc0: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
bbd0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
bbe0: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
bbf0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
bc00: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
bc10: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
bc20: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
bc30: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
bc40: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
bc50: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
bc60: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
bc70: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
bc80: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
bc90: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
bca0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
bcb0: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
bcc0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
bcd0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
bce0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bcf0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
bd00: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
bd10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
bd20: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
bd30: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bd40: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
bd50: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
bd60: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bd70: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
bd80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
bd90: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
bda0: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
bdb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
bdc0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
bdd0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
bde0: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
bdf0: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
be00: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
be10: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
be20: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
be30: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
be40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
be50: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
be60: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
be70: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
be80: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
be90: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
bea0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
beb0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
bec0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
bed0: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
bee0: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
bef0: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
bf00: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
bf10: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
bf20: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
bf30: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
bf40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
bf50: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
bf60: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
bf70: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
bf80: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
bf90: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
bfa0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
bfb0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
bfc0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
bfd0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
bfe0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
bff0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
c000: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
c010: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
c020: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
c030: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
c040: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
c050: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
c060: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
c070: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
c080: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
c090: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
c0a0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
c0b0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
c0c0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
c0d0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
c0e0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
c0f0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
c100: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
c110: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
c120: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
c130: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
c140: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
c150: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
c160: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
c170: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
c180: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
c190: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
c1a0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
c1b0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
c1c0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
c1d0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
c1e0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
c1f0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
c200: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
c210: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
c220: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  ough..**.** IMPL
c230: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
c240: 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c  -34230-56049 SQL
c250: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
c260: 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20  y increments.** 
c270: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
c280: 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  on whenever the 
c290: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
c2a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c2b0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
c2c0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c2d0: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
c2e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c2f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c300: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
c310: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c320: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c330: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
c340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c350: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
c360: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
c370: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20  MA_VERSION, .   
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65  (int)(1+(unsigne
c3a0: 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  d)db->aDb[iDb].p
c3b0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
c3c0: 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ookie));.}../*.*
c3d0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
c3e0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
c3f0: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
c400: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
c410: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
c420: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
c430: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
c440: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
c450: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
c460: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
c470: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
c480: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
c490: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
c4a0: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
c4b0: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
c4c0: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
c4d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
c4e0: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
c4f0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
c500: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
c510: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
c520: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
c530: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
c540: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
c550: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
c560: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c570: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
c580: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
c590: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
c5a0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c5b0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
c5c0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
c5d0: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
c5e0: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
c5f0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c600: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
c610: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
c620: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
c630: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
c640: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
c650: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
c660: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
c670: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
c680: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
c690: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
c6a0: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
c6b0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
c6c0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
c6d0: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
c6e0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
c6f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
c700: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
c710: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
c720: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
c730: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
c740: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
c750: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
c760: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
c770: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
c780: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
c790: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c7a0: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
c7b0: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
c7c0: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
c7d0: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
c7e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
c7f0: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
c800: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
c810: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
c820: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
c830: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
c840: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
c850: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
c860: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
c870: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
c880: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
c890: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
c8a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
c8b0: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
c8c0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
c8d0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
c8e0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
c8f0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
c900: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
c910: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
c920: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
c930: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
c940: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
c950: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
c960: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
c970: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
c980: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
c990: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
c9a0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
c9b0: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
c9c0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
c9d0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
c9e0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
c9f0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
ca00: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
ca10: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
ca20: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
ca30: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
ca40: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ca50: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
ca60: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
ca70: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
ca80: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
ca90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
caa0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
cab0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
cac0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
cad0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
cae0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
caf0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
cb00: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
cb10: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
cb20: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
cb30: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
cb40: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
cb50: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
cb60: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
cb70: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
cb80: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
cb90: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
cba0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
cbb0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
cbc0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
cbd0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
cbe0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
cbf0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
cc00: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
cc10: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
cc20: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
cc30: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
cc40: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
cc50: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
cc60: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
cc70: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
cc80: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
cc90: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
cca0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
ccb0: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
ccc0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
ccd0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
cce0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
ccf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
cd00: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
cd10: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
cd20: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
cd30: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
cd40: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
cd50: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
cd60: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
cd70: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
cd80: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
cd90: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
cda0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
cdb0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
cdc0: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
cdd0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
cde0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
cdf0: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
ce00: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
ce10: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
ce20: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
ce30: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
ce40: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
ce50: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
ce60: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
ce70: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
ce80: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
ce90: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
cea0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
ceb0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
cec0: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
ced0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
cee0: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
cef0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
cf00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
cf10: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
cf20: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
cf30: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
cf40: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
cf50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cf60: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
cf70: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
cf80: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
cf90: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
cfa0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
cfb0: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
cfc0: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
cfd0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
cfe0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
cff0: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
d000: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d010: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d020: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
d030: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d040: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d050: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
d060: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d070: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d080: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
d090: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d0a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d0b0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
d0c0: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
d0d0: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
d0e0: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
d0f0: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
d100: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
d110: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
d120: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
d130: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d140: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
d150: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
d160: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
d170: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
d180: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
d190: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
d1a0: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
d1b0: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
d1c0: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
d1d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
d1e0: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
d1f0: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
d200: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
d210: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
d220: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
d230: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
d240: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
d250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
d260: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
d270: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
d280: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
d290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d2a0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d2b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
d2c0: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
d2d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
d2e0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
d2f0: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
d300: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
d310: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
d320: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
d330: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
d340: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
d350: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
d360: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
d370: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
d380: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d390: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
d3a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d3b0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
d3c0: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
d3d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
d3e0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
d3f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d400: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
d410: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74  onst char**)zExt
d420: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
d430: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b  sizeof(char*)*N;
d440: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d450: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
d460: 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49  , sizeof(i16)*pI
d470: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d480: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
d490: 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20   (i16*)zExtra;. 
d4a0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
d4b0: 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63  f(i16)*N;.  memc
d4c0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d4d0: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64  >aSortOrder, pId
d4e0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d4f0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
d500: 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20  = (u8*)zExtra;. 
d510: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d520: 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65   N;.  pIdx->isRe
d530: 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74  sized = 1;.  ret
d540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d550: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d560: 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77   the total row w
d570: 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65  idth for a table
d580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d590: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
d5a0: 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dth(Table *pTab)
d5b0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61  {.  unsigned wTa
d5c0: 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ble = 0;.  const
d5d0: 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
d5e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
d5f0: 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  (i=pTab->nCol, p
d600: 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
d610: 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61  l; i>0; i--, pTa
d620: 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61  bCol++){.    wTa
d630: 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e  ble += pTabCol->
d640: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  szEst;.  }.  if(
d650: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29   pTab->iPKey<0 )
d660: 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61   wTable++;.  pTa
d670: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
d680: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62  lite3LogEst(wTab
d690: 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le*4);.}../*.** 
d6a0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
d6b0: 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72  rage size of a r
d6c0: 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  ow for an index.
d6d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d6e0: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
d6f0: 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  th(Index *pIdx){
d700: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64  .  unsigned wInd
d710: 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ex = 0;.  int i;
d720: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
d730: 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54  *aCol = pIdx->pT
d740: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f  able->aCol;.  fo
d750: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
d760: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d770: 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e    i16 x = pIdx->
d780: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
d790: 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d   assert( x<pIdx-
d7a0: 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b  >pTable->nCol );
d7b0: 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78  .    wIndex += x
d7c0: 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49  <0 ? 1 : aCol[pI
d7d0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
d7e0: 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49  .szEst;.  }.  pI
d7f0: 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  dx->szIdxRow = s
d800: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e  qlite3LogEst(wIn
d810: 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  dex*4);.}../* Re
d820: 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c  turn true if val
d830: 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e  ue x is found an
d840: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
d850: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
d860: 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63  iCol[].*/.static
d870: 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63   int hasColumn(c
d880: 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c  onst i16 *aiCol,
d890: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78   int nCol, int x
d8a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c  ){.  while( nCol
d8b0: 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d  -- > 0 ) if( x==
d8c0: 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74  *(aiCol++) ) ret
d8d0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
d8e0: 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75  0;.}../* Recompu
d8f0: 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78  te the colNotIdx
d900: 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ed field of the 
d910: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c  Index..**.** col
d920: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69  NotIdxed is a bi
d930: 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61  tmask that has a
d940: 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74   0 bit represent
d950: 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64  ing each indexed
d960: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
d970: 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
d980: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
d990: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
d9a0: 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65  The.** high-orde
d9b0: 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49  r bit of colNotI
d9c0: 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31  dxed is always 1
d9d0: 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64  .  All unindexed
d9e0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
d9f0: 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20  he table have a 
da00: 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  1..**.** The col
da10: 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73  NotIdxed mask is
da20: 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65   AND-ed with the
da30: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c   SrcList.a[].col
da40: 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20  Used mask.** to 
da50: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
da60: 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69   index is coveri
da70: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ng index..*/.sta
da80: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75  tic void recompu
da90: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
daa0: 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29  xed(Index *pIdx)
dab0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
dac0: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
dad0: 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
dae0: 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
daf0: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
db00: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
db10: 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
db20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
db30: 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
db40: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
db50: 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
db60: 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
db70: 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
db80: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63   }.  }.  pIdx->c
db90: 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b  olNotIdxed = ~m;
dba0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
dbb0: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36  ->colNotIdxed>>6
dbc0: 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3)==1 );.}../*.*
dbd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
dbe0: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
dbf0: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
dc00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
dc10: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
dc20: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
dc30: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
dc40: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dc50: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
dc60: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
dc70: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
dc80: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
dc90: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
dca0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
dcb0: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
dcc0: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
dcd0: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
dce0: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
dcf0: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
dd00: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
dd10: 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c      (1)  Set all
dd20: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
dd30: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
dd40: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
dd50: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
dd60: 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33   (2)  Convert P3
dd70: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
dd80: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
dd90: 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b   from BTREE_INTK
dda0: 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EY .**          
ddb0: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
ddc0: 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  EY..**     (3)  
ddd0: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
dde0: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
ddf0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
de00: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
de10: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
de20: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
de30: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
de40: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
de50: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
de60: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
de70: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
de80: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
de90: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
dea0: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
deb0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
dec0: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
ded0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
dee0: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
def0: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
df00: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
df10: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
df20: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
df30: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
df40: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
df50: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
df60: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
df70: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
df80: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
df90: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
dfa0: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
dfb0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
dfc0: 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72  nAllField and ar
dfd0: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
dfe0: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
dff0: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
e000: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
e010: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
e020: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
e030: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
e040: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
e050: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
e060: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
e070: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
e080: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   KEY columns..**
e090: 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20  .** For virtual 
e0a0: 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29  tables, only (1)
e0b0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
e0c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e0d0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e0e0: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
e0f0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e100: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
e110: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
e120: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
e130: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
e140: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e150: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
e160: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e170: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
e180: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
e190: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
e1a0: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
e1b0: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
e1c0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
e1d0: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e1e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e1f0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e200: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
e210: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
e220: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
e230: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
e240: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
e250: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
e260: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
e270: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
e280: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
e290: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
e2a0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
e2b0: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
e2c0: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
e2d0: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
e2e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
e2f0: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
e300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
e310: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e320: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
e330: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
e340: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
e350: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
e360: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e370: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
e380: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
e390: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
e3a0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
e3b0: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
e3c0: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
e3d0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
e3e0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
e3f0: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
e400: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
e410: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
e420: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
e430: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
e440: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
e450: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
e460: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
e470: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
e480: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
e490: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e4a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
e4b0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
e4c0: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
e4d0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e4e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e4f0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
e500: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
e510: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
e520: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
e530: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
e540: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
e550: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
e560: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
e570: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
e580: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
e5b0: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
e5c0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
e5d0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
e5e0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
e5f0: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
e600: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e610: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
e620: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
e630: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e640: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
e650: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
e660: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
e670: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
e680: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
e690: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
e6a0: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
e6b0: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
e6c0: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
e6d0: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
e6e0: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
e6f0: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
e700: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
e710: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
e720: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
e730: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
e740: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
e750: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
e760: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
e770: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e780: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
e790: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
e7a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
e7b0: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
e7c0: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
e7d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
e7e0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
e7f0: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
e800: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
e810: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
e820: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
e830: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
e840: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
e850: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
e860: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
e870: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
e880: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
e890: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
e8a0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73  Col;..  /* Bypas
e8b0: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
e8c0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e8d0: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
e8e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
e8f0: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
e900: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
e910: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
e920: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
e930: 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72  BE.  ** code for
e940: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e950: 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e  (not when parsin
e960: 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66  g one as part of
e970: 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20   reading.  ** a 
e980: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
e990: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
e9a0: 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a   pPk->tnum>0 ){.
e9b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
e9c0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
e9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e9e0: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
e9f0: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
ea00: 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  o);.  }..  /* Th
ea10: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
ea20: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
ea30: 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  s the table root
ea40: 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e   page */.  pPk->
ea50: 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  tnum = pTab->tnu
ea60: 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  m;..  /* Update 
ea70: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
ea80: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ea90: 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63  all UNIQUE indic
eaa0: 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  es by converting
eab0: 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
eac0: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  rowid column int
ead0: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  o one or more co
eae0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
eaf0: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20  MARY KEY..  */. 
eb00: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
eb10: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
eb20: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
eb30: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
eb40: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
eb50: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
eb60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
eb70: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
eb80: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
eb90: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
eba0: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ebb0: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ebc0: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
ebd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ebe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
ebf0: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
ec00: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
ec10: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
ec20: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
ec30: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
ec40: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
ec50: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
ec60: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
ec70: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
ec80: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
ec90: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
eca0: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
ecb0: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
ecc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ecd0: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ece0: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ecf0: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ed00: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
ed10: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
ed20: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
ed30: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
ed40: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
ed50: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
ed60: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
ed70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed80: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
ed90: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
eda0: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
edb0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
edc0: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
edd0: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
ede0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
edf0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ee00: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
ee10: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
ee20: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
ee30: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
ee40: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
ee50: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
ee60: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
ee70: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
ee80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
ee90: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
eea0: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
eeb0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
eec0: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
eed0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
eee0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
eef0: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
ef00: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74  zColl[j] = sqlit
ef10: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
ef20: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
ef30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
ef40: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
ef50: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
ef60: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
ef70: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
ef80: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
ef90: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
efa0: 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
efb0: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b  nsNotIndexed(pPk
efc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
efd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
efe0: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
eff0: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
f000: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
f010: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
f020: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
f030: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
f040: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
f050: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
f060: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
f070: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
f080: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
f090: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
f0a0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
f0b0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
f0c0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
f0d0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
f0e0: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
f0f0: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
f100: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
f110: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
f120: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
f130: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
f140: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
f150: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
f160: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
f170: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f180: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
f190: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
f1a0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f1b0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
f1c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f1d0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
f1e0: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
f1f0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
f200: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
f210: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
f220: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f230: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
f240: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
f250: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
f260: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
f270: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
f280: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
f290: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
f2a0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
f2b0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
f2c0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
f2d0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
f2e0: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
f2f0: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
f300: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
f310: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
f320: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
f330: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
f340: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
f350: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
f360: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
f370: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f380: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
f390: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
f3a0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
f3b0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
f3c0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
f3d0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
f3e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f400: 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
f410: 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
f420: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
f430: 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
f440: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
f450: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
f460: 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
f470: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
f480: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
f490: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
f4a0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
f4b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
f4e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
f4f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
f500: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
f510: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
f520: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
f530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
f540: 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
f550: 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
f560: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f580: 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
f590: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
f5a0: 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30  /..  if( pEnd==0
f5b0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29   && pSelect==0 )
f5c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
f5d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  }.  assert( !db-
f5e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
f5f0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
f600: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
f610: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
f620: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
f630: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
f640: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
f650: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
f660: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
f670: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
f680: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
f690: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
f6a0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
f6b0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
f6c0: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
f6d0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
f6e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
f6f0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
f700: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
f710: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
f720: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
f730: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
f740: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
f750: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
f760: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
f770: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
f780: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f790: 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65  er is 1, that me
f7a0: 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65 20  ans this is the 
f7b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
f7c0: 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  ** table itself.
f7d0: 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61    So mark it rea
f7e0: 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  d-only..  */.  i
f7f0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
f800: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c   ){.    if( pSel
f810: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
f820: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f830: 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  rse, "");.      
f840: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
f850: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
f860: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
f870: 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31    if( p->tnum==1
f880: 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c   ) p->tabFlags |
f890: 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20  = TF_Readonly;. 
f8a0: 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
f8b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
f8c0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61  WITHOUT ROWID Ta
f8d0: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61  bles */.  if( ta
f8e0: 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f  bOpts & TF_Witho
f8f0: 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  utRowid ){.    i
f900: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
f910: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
f920: 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nt) ){.      sql
f930: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f940: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
f950: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f  AUTOINCREMENT no
f960: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54  t allowed on WIT
f970: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
f980: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
f990: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
f9a0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
f9b0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
f9c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
f9d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f9e0: 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b  arse, "PRIMARY K
f9f0: 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61  EY missing on ta
fa00: 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  ble %s", p->zNam
fa10: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
fa20: 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73       p->tabFlags
fa30: 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f   |= TF_WithoutRo
fa40: 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  wid | TF_NoVisib
fa50: 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  leRowid;.      c
fa60: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
fa70: 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65  owidTable(pParse
fa80: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
fa90: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
faa0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
fab0: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
fac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fad0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
fae0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
faf0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
fb00: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
fb10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
fb20: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71  pCheck ){.    sq
fb30: 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
fb40: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
fb50: 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c  , p, NC_IsCheck,
fb60: 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a   0, p->pCheck);.
fb70: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
fb80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fb90: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
fba0: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
fbb0: 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65  average row size
fbc0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
fbd0: 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69  nd for all impli
fbe0: 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ed indices */.  
fbf0: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
fc00: 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64  th(p);.  for(pId
fc10: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
fc20: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
fc30: 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61  ext){.    estima
fc40: 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64  teIndexWidth(pId
fc50: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  x);.  }..  /* If
fc60: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
fc70: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
fc80: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
fc90: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
fca0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
fcb0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
fcc0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
fcd0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
fce0: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
fcf0: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
fd00: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
fd10: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
fd20: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
fd30: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
fd40: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
fd50: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
fd60: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
fd70: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
fd80: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
fd90: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
fda0: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
fdb0: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
fdc0: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
fdd0: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
fde0: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
fdf0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
fe00: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
fe10: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
fe20: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
fe30: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
fe40: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
fe50: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
fe60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fe70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
fe80: 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  se, 0);..    /* 
fe90: 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  .    ** Initiali
fea0: 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  ze zType for the
feb0: 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62   new view or tab
fec0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
fed0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
fee0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
fef0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
ff00: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
ff10: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
ff20: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
ff30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ff40: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
ff50: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
ff60: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
ff70: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
ff80: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
ff90: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
ffa0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
ffb0: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
ffc0: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
ffd0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
ffe0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
fff0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
10000 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
10010 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
10020 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
10030 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
10040 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
10050 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
10060 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
10070 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
10080 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
10090 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
100a0 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
100b0 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
100c0 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
100d0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
100e0 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
100f0 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
10100 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
10110 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
10120 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
10130 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
10140 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
10150 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
10160 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
10170 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
10180 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
10190 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
101a0 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
101b0 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
101c0 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
101d0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
101e0 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
101f0 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
10200 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
10210 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10220 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
10230 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
10240 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
10250 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73   SELECT should s
10260 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  tore results */.
10270 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65        int regYie
10280 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ld;       /* Reg
10290 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
102a0 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70  -routine entry-p
102b0 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  oint */.      in
102c0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
102d0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
102e0 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
102f0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20      int regRec; 
10300 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63          /* A rec
10310 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
10320 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61   into the new ta
10330 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
10340 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20   regRowid;      
10350 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65   /* Rowid of the
10360 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73   next row to ins
10370 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ert */.      int
10380 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20   addrInsLoop;   
10390 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
103a0 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e  oop for insertin
103b0 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  g rows */.      
103c0 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
103d0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74      /* A table t
103e0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
103f0 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  e SELECT results
10400 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69   */..      regYi
10410 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eld = ++pParse->
10420 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
10430 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ec = ++pParse->n
10440 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
10450 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
10460 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  nMem;.      asse
10470 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
10480 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
10490 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
104a0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
104b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
104c0 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
104d0 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
104e0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
104f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
10500 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52  (v, OPFLAG_P2ISR
10510 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  EG);.      pPars
10520 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
10530 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
10540 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10550 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20  ddr(v) + 1;.    
10560 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10570 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
10580 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
10590 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  d, 0, addrTop);.
105a0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
105b0 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
105c0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
105d0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
105e0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
105f0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
10600 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
10610 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
10620 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
10630 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
10640 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
10650 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nCol;.      p->a
10660 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
10670 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
10680 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
10690 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
106a0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
106b0 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
106c0 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
106d0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
106e0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
106f0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
10700 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20  regYield);.     
10710 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10720 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
10730 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  &dest);.      if
10740 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
10750 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73   return;.      s
10760 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
10770 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65  outine(v, regYie
10780 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
10790 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
107a0 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a  , addrTop - 1);.
107b0 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f        addrInsLoo
107c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
107d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
107e0 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  d, dest.iSDParm)
107f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
10800 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
10810 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10820 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
10830 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64  d, dest.iSdst, d
10840 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65  est.nSdst, regRe
10850 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c);.      sqlite
10860 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
10870 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , p, 0);.      s
10880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10890 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
108a0 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   1, regRowid);. 
108b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
108c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
108d0 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20  ert, 1, regRec, 
108e0 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
108f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
10900 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
10910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10920 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10930 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
10940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10950 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10960 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 1);.    }..   
10970 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
10980 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
10990 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
109a0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
109b0 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
109c0 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
109d0 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
109e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
109f0 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20     Token *pEnd2 
10a00 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61  = tabOpts ? &pPa
10a10 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20  rse->sLastToken 
10a20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20  : pEnd;.      n 
10a30 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a  = (int)(pEnd2->z
10a40 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
10a50 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  Token.z);.      
10a60 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21  if( pEnd2->z[0]!
10a70 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64  =';' ) n += pEnd
10a80 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d  2->n;.      zStm
10a90 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
10aa0 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  tf(db, .        
10ab0 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a    "CREATE %s %.*
10ac0 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70  s", zType2, n, p
10ad0 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
10ae0 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  n.z.      );.   
10af0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
10b00 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
10b10 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10b20 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
10b30 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
10b40 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
10b50 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
10b60 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
10b70 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
10b80 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
10b90 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
10ba0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
10bb0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10bc0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
10bd0 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20  UPDATE %Q.%s ". 
10be0 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70          "SET typ
10bf0 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c  e='%s', name=%Q,
10c00 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f   tbl_name=%Q, ro
10c10 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d  otpage=#%d, sql=
10c20 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45  %Q ".       "WHE
10c30 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20  RE rowid=#%d",. 
10c40 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
10c50 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
10c60 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a  ER_NAME,.      z
10c70 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
10c80 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
10c90 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
10ca0 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
10cb0 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
10cc0 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
10cd0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
10ce0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
10cf0 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
10d00 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
10d10 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
10d20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10d30 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
10d40 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
10d50 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
10d60 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
10d70 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10d80 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
10d90 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
10da0 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
10db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10dc0 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
10dd0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
10de0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20  !=0 ){.      Db 
10df0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
10e00 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
10e10 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10e20 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
10e30 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
10e40 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
10e50 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
10e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
10e70 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10e80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
10e90 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
10ea0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
10eb0 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
10ec0 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d      pDb->zDbSNam
10ed0 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
10ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
10ef0 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
10f00 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
10f10 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
10f20 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
10f30 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
10f40 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
10f50 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 69  hemaOp(pParse, i
10f60 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  Db,.           s
10f70 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
10f80 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
10f90 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67   AND type!='trig
10fa0 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ger'", p->zName)
10fb0 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
10fc0 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
10fd0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
10fe0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
10ff0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
11000 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
11010 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
11020 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
11030 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
11040 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
11050 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11060 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11070 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
11080 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
11090 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
110a0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
110b0 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20  >zName, p);.    
110c0 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
110d0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
110e0 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
110f0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
11100 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
11110 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  rt() */.      sq
11120 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
11130 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
11140 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
11150 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
11160 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
11170 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
11180 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e  emaChange;..#ifn
11190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111a0 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
111b0 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
111c0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
111d0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
111e0 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
111f0 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
11200 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
11210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
11220 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
11230 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
11240 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
11250 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
11260 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
11270 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
11280 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
11290 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
112a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
112b0 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
112c0 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
112d0 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
112e0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
112f0 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
11300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11310 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
11320 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
11330 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
11340 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
11350 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
11360 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
11370 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11380 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
11390 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
113a0 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
113b0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
113c0 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
113d0 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
113e0 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
113f0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
11400 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
11410 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
11420 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
11430 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
11440 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
11450 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
11460 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
11470 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61    ExprList *pCNa
11480 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c  mes, /* Optional
11490 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f   list of view co
114a0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
114b0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
114c0 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
114d0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
114e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
114f0 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
11500 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
11510 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
11520 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
11530 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
11540 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
11550 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11560 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
11570 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
11580 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
11590 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
115a0 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
115b0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
115c0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
115d0 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
115e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
115f0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
11600 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
11610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11620 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11630 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
11640 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
11650 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  iews");.    goto
11660 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
11670 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
11680 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
11690 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
116a0 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
116b0 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
116c0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
116d0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
116e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
116f0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11700 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54  fail;.  sqlite3T
11710 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
11720 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
11730 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
11740 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11750 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
11760 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
11770 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
11780 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
11790 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  view", pName);. 
117a0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
117b0 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
117c0 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65  lect) ) goto cre
117d0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
117e0 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
117f0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
11800 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11810 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
11820 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
11830 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
11840 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
11850 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
11860 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
11870 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
11880 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
11890 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
118a0 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
118b0 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
118c0 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
118d0 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
118e0 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
118f0 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  eturns..  */.  i
11900 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
11910 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53  ECT ){.    p->pS
11920 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
11930 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30  .    pSelect = 0
11940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11950 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
11960 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11970 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
11980 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20  P_REDUCE);.  }. 
11990 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
119a0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
119b0 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
119c0 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
119d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
119e0 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
119f0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
11a00 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
11a10 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
11a20 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
11a30 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
11a40 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
11a50 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
11a60 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
11a70 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
11a80 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73  End.z[0]!=0 || s
11a90 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  End.n==0 );.  if
11aa0 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  ( sEnd.z[0]!=';'
11ab0 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
11ac0 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
11ad0 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
11ae0 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
11af0 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61   pBegin->z);.  a
11b00 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
11b10 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
11b20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
11b30 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
11b40 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
11b50 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
11b60 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
11b70 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
11b80 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
11b90 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
11ba0 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
11bb0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
11bc0 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
11bd0 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
11be0 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69  .create_view_fai
11bf0 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  l:.  sqlite3Sele
11c00 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
11c10 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f  lect);.  if( IN_
11c20 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
11c30 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
11c40 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28  meExprlistUnmap(
11c50 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29  pParse, pCNames)
11c60 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
11c70 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
11c80 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65  , pCNames);.  re
11c90 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11ca0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11cb0 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
11cc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11cd0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
11ce0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
11cf0 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
11d00 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
11d10 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
11d20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
11d30 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
11d40 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
11d50 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
11d60 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
11d70 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
11d80 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
11d90 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
11da0 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
11db0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
11dc0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
11dd0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
11de0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
11df0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
11e00 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
11e10 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
11e20 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
11e30 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
11e40 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
11e50 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11e60 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
11e70 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
11e80 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
11e90 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
11ea0 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
11eb0 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
11ec0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
11ed0 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
11ee0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
11ef0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
11f00 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
11f10 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
11f20 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
11f30 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11f40 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
11f50 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
11f60 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11f70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11f80 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11f90 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65  BLE.  int rc;.#e
11fa0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
11fb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11fc0 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  ZATION.  sqlite3
11fd0 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
11fe0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
11ff0 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65  th pointer */.#e
12000 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12010 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
12020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12030 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62  IRTUALTABLE.  db
12040 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b  ->nSchemaLock++;
12050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
12060 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
12070 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
12080 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
12090 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  k--;.  if( rc ){
120a0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
120b0 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
120c0 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
120d0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
120e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
120f0 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
12100 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
12110 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
12120 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
12130 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
12140 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
12150 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
12160 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
12170 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
12180 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
12190 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
121a0 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
121b0 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
121c0 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
121d0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
121e0 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
121f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
12200 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
12210 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
12220 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
12230 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
12240 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
12250 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
12260 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
12270 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
12280 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
12290 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
122a0 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
122b0 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
122c0 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
122d0 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
122e0 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
122f0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
12300 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
12310 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
12320 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
12330 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
12340 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
12350 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
12360 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
12370 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
12380 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
12390 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
123a0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
123b0 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
123c0 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
123d0 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
123e0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
123f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12400 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
12410 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
12420 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
12430 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
12440 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
12450 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
12460 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
12470 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
12480 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
12490 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
124a0 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
124b0 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
124c0 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
124d0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
124e0 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
124f0 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
12500 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
12510 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
12520 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
12530 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
12540 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
12550 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
12560 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
12570 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
12580 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
12590 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
125a0 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
125b0 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
125c0 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
125d0 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
125e0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
125f0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
12600 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
12610 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
12620 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
12630 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
12640 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
12650 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
12660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12670 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
12680 20 20 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64      u8 eParseMod
12690 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72  e = pParse->ePar
126a0 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72  seMode;.    pPar
126b0 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d  se->eParseMode =
126c0 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d   PARSE_MODE_NORM
126d0 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  AL;.#endif.    n
126e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
126f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
12700 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
12710 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
12720 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
12730 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
12740 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12750 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64  Disable++;.#ifnd
12760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12770 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
12780 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
12790 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
127a0 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
127b0 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
127c0 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
127d0 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
127e0 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
127f0 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
12800 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
12810 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12820 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
12830 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
12840 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
12850 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
12860 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  eck ){.      /* 
12870 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
12880 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e  (arglist) AS ...
12890 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61  .      ** The na
128a0 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
128b0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
128c0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20  are taken from. 
128d0 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20       ** arglist 
128e0 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
128f0 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  in pTable->pChec
12900 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66  k.  The pCheck f
12910 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  ield.      ** no
12920 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45  rmally holds CHE
12930 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
12940 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  n an ordinary ta
12950 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20  ble, but for.   
12960 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20     ** a VIEW it 
12970 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f  holds the list o
12980 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a  f column names..
12990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
129a0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
129b0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
129c0 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
129d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f      &pTable->nCo
12a00 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l, &pTable->aCol
12a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
12a20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
12a30 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72   .       && pPar
12a40 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20  se->nErr==0.    
12a50 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43     && pTable->nC
12a60 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ol==pSel->pEList
12a70 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
12a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12a90 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12aa0 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12ab0 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20  pParse, pTable, 
12ac0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
12ad0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
12ae0 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lTab ){.      /*
12af0 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
12b00 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74  e AS...  without
12b10 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73   an argument lis
12b20 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20  t.  Construct.  
12b30 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d      ** the colum
12b40 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
12b50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
12b60 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
12b70 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a  he view..      *
12b80 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
12b90 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
12ba0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
12bb0 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
12bc0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
12bd0 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
12be0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
12bf0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
12c00 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
12c10 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
12c20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12c30 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
12c40 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
12c50 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
12c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
12c70 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
12c80 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
12c90 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
12ca0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
12cb0 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  SelTab);.    sql
12cc0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
12cd0 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  (db, pSel);.    
12ce0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
12cf0 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65  isable--;.#ifnde
12d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
12d10 54 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61  TERTABLE.    pPa
12d20 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20  rse->eParseMode 
12d30 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65  = eParseMode;.#e
12d40 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ndif.  } else {.
12d50 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
12d60 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
12d70 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
12d80 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
12d90 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  s;.  if( db->mal
12da0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12db0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
12dc0 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
12dd0 61 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c  able);.    pTabl
12de0 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->aCol = 0;.   
12df0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12e00 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
12e10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12e20 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
12e30 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
12e40 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12e50 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
12e60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12e70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12e80 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
12e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
12ea0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
12eb0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
12ec0 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
12ed0 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
12ee0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12ef0 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12f00 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
12f10 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
12f20 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
12f30 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12f40 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
12f50 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
12f60 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
12f70 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
12f80 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
12f90 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
12fa0 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
12fb0 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
12fc0 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
12fd0 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
12fe0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
12ff0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13000 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
13010 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
13020 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
13030 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
13040 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
13050 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
13060 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
13070 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
13080 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
13090 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
130a0 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
130b0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
130c0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
130d0 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
130e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
130f0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
13100 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13110 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
13120 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
13130 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
13140 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
13150 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
13160 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
13170 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
13180 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
13190 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
131a0 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
131b0 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
131c0 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
131d0 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
131e0 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
131f0 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
13200 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
13210 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
13220 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
13230 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
13240 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
13250 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
13260 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
13270 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
13280 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
13290 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
132a0 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
132b0 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
132c0 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
132d0 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
132e0 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
132f0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
13300 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
13310 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
13320 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
13330 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
13340 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
13350 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
13360 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
13370 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
13380 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
13390 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
133a0 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
133b0 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
133c0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
133d0 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
133e0 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
133f0 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
13400 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
13410 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
13420 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
13430 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
13440 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
13450 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
13460 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13470 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13480 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
13490 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
134a0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
134b0 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
134c0 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
134d0 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
134e0 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
134f0 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
13500 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13510 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
13520 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
13530 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
13540 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
13550 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
13560 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
13570 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
13580 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
13590 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
135a0 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
135b0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
135c0 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
135d0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
135e0 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
135f0 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
13600 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
13610 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
13620 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
13630 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13640 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
13650 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
13660 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
13670 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
13680 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
13690 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
136a0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
136b0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
136c0 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
136d0 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
136e0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
136f0 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
13700 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
13710 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
13720 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
13730 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
13740 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
13750 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
13760 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
13770 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
13780 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
13790 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
137a0 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
137b0 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
137c0 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
137d0 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
137e0 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
137f0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
13800 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
13810 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
13820 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
13830 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
13840 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
13850 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13860 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13870 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
13880 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13890 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
138a0 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29 3b 0a  rt( iTable>1 );.
138b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
138c0 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
138d0 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
138e0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  Db);.  sqlite3Ma
138f0 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
13900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13910 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13920 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
13930 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
13940 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
13950 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
13960 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
13970 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
13980 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
13990 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
139a0 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
139b0 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
139c0 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
139d0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
139e0 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
139f0 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
13a00 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e  **.  ** The "#NN
13a10 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  N" in the SQL is
13a20 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
13a30 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
13a40 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
13a50 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  ** is in registe
13a60 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d  r NNN.  See gram
13a70 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69  mar rules associ
13a80 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b  ated with the TK
13a90 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74  _REGISTER.  ** t
13aa0 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  oken for additio
13ab0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
13ac0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
13ad0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
13ae0 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
13af0 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
13b00 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64  age=%d WHERE #%d
13b10 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25   AND rootpage=#%
13b20 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  d",.     pParse-
13b30 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
13b40 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
13b50 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  AME, iTable, r1,
13b60 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73   r1);.#endif.  s
13b70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13b80 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
13b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
13ba0 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72   VDBE code to er
13bb0 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61  ase table pTab a
13bc0 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65  nd all associate
13bd0 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73  d indices on dis
13be0 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70  k..** Code to up
13bf0 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f  date the sqlite_
13c00 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e  master tables an
13c10 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
13c20 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  a definitions.**
13c30 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d   in case a root-
13c40 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
13c50 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  o another table 
13c60 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
13c70 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69  btree layer.** i
13c80 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68  s also added (th
13c90 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
13ca0 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
13cb0 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  m database)..*/.
13cc0 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
13cd0 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a  royTable(Parse *
13ce0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
13cf0 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  Tab){.  /* If th
13d00 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
13d10 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61  e auto-vacuum ca
13d20 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45  pable (if SQLITE
13d30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13d40 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66  .  ** is not def
13d50 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69  ined), then it i
13d60 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63  s important to c
13d70 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f  all OP_Destroy o
13d80 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65  n the.  ** table
13d90 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d   and index root-
13da0 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20  pages in order, 
13db0 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
13dc0 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20  e numerically . 
13dd0 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74   ** largest root
13de0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68  -page number. Th
13df0 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  is guarantees th
13e00 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72  at none of the r
13e10 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74  oot-pages.  ** t
13e20 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69  o be destroyed i
13e30 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61  s relocated by a
13e40 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73  n earlier OP_Des
13e50 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68  troy. i.e. if th
13e60 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  e.  ** following
13e70 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a   were coded:.  *
13e80 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  *.  ** OP_Destro
13e90 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20  y 4 0.  ** .... 
13ea0 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35   ** OP_Destroy 5
13eb0 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64   0.  **.  ** and
13ec0 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70   root page 5 hap
13ed0 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20  pened to be the 
13ee0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
13ef0 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
13f00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
13f10 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20  hen root page 5 
13f20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74  would be moved t
13f30 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20  o page 4 by the 
13f40 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f  .  ** "OP_Destro
13f50 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54  y 4 0" opcode. T
13f60 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f  he subsequent "O
13f70 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77  P_Destroy 5 0" w
13f80 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20  ould hit.  ** a 
13f90 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a  free-list page..
13fa0 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20    */.  int iTab 
13fb0 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20  = pTab->tnum;.  
13fc0 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d  int iDestroyed =
13fd0 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
13fe0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
13ff0 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72  dx;.    int iLar
14000 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  gest = 0;..    i
14010 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  f( iDestroyed==0
14020 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f   || iTab<iDestro
14030 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  yed ){.      iLa
14040 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20  rgest = iTab;.  
14050 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78    }.    for(pIdx
14060 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
14070 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
14080 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
14090 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74  t iIdx = pIdx->t
140a0 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  num;.      asser
140b0 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61  t( pIdx->pSchema
140c0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
140d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
140e0 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28  estroyed==0 || (
140f0 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29  iIdx<iDestroyed)
14100 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65  ) && iIdx>iLarge
14110 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c  st ){.        iL
14120 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20  argest = iIdx;. 
14130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14140 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30   if( iLargest==0
14150 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14170 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
14180 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
14190 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
141a0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
141b0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e      assert( iDb>
141c0 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
141d0 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  ->db->nDb );.   
141e0 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
141f0 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67  ge(pParse, iLarg
14200 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  est, iDb);.     
14210 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c   iDestroyed = iL
14220 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20  argest;.    }.  
14230 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
14240 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
14250 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
14260 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
14270 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
14280 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
14290 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
142a0 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
142b0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
142c0 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
142d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
142e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
142f0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14300 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
14310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14320 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
14330 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14340 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
14350 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
14360 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14370 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
14380 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
14390 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
143a0 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
143b0 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
143c0 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
143d0 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72  .zDbSName;.  for
143e0 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29  (i=1; i<=4; i++)
143f0 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b  {.    char zTab[
14400 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  24];.    sqlite3
14410 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
14420 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c  (zTab),zTab,"sql
14430 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a  ite_stat%d",i);.
14440 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
14450 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
14460 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61  >db, zTab, zDbNa
14470 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
14480 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
14490 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
144a0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
144b0 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c  %s WHERE %s=%Q",
144c0 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65  .        zDbName
144d0 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a  , zTab, zType, z
144e0 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
144f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14500 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14510 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a  o drop a table..
14520 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
14530 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  odeDropTable(Par
14540 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
14550 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62  e *pTab, int iDb
14560 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
14570 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
14580 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
14590 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20  ->db;.  Trigger 
145a0 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20  *pTrigger;.  Db 
145b0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
145c0 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  iDb];..  v = sql
145d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
145e0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
145f0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
14600 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
14610 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
14620 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
14630 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14640 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
14650 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
14660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14670 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
14680 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  in);.  }.#endif.
14690 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74  .  /* Drop all t
146a0 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
146b0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
146c0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
146d0 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65   Code.  ** is ge
146e0 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
146f0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
14700 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
14710 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  /or.  ** sqlite_
14720 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
14730 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
14740 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
14750 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
14760 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77  arse, pTab);.  w
14770 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
14780 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
14790 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
147a0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
147b0 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  | .        pTrig
147c0 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
147d0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
147e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
147f0 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
14800 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
14810 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
14820 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
14830 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14840 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
14850 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  CREMENT.  /* Rem
14860 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
14870 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
14880 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
14890 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a  ociated with.  *
148a0 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
148b0 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
148c0 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
148d0 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
148e0 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20  ped.  ** at the 
148f0 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
14900 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
14910 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
14920 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76  eeds to.  ** mov
14930 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
14940 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
14950 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
14960 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f  cuum mode)..  */
14970 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
14980 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
14990 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
149a0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
149b0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
149c0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
149d0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
149e0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
149f0 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53  .      pDb->zDbS
14a00 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
14a10 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
14a20 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
14a30 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
14a40 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
14a50 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
14a60 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
14a70 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
14a80 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
14a90 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
14aa0 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
14ab0 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
14ac0 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
14ad0 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
14ae0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
14af0 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
14b00 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
14b10 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
14b20 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
14b30 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
14b40 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
14b50 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
14b60 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
14b70 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
14b80 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
14b90 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
14ba0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14bb0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
14bc0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
14bd0 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
14be0 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
14bf0 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
14c00 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db->zDbSName, MA
14c10 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d  STER_NAME, pTab-
14c20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  >zName);.  if( !
14c30 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
14c40 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14c50 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
14c60 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
14c70 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
14c80 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
14c90 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
14ca0 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
14cb0 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
14cc0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
14cd0 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
14ce0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d00 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
14d10 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
14d20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
14d30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
14d40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
14d50 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
14d60 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
14d70 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68   0);.  sqlite3Ch
14d80 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
14d90 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  e, iDb);.  sqlit
14da0 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
14db0 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
14dc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
14dd0 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
14de0 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
14df0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
14e00 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
14e10 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
14e20 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
14e30 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
14e40 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
14e50 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
14e60 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
14e70 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
14e80 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
14e90 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
14ea0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
14eb0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
14ec0 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Db;..  if( db->m
14ed0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14ee0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14ef0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
14f00 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
14f10 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Err==0 );.  asse
14f20 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
14f30 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =1 );.  if( sqli
14f40 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
14f50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
14f60 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14f70 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
14f80 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20  suppressErr++;. 
14f90 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d   assert( isView=
14fa0 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f  =0 || isView==LO
14fb0 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70  CATE_VIEW );.  p
14fc0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
14fd0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
14fe0 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e  rse, isView, &pN
14ff0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66  ame->a[0]);.  if
15000 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
15010 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20  ppressErr--;..  
15020 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
15030 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73     if( noErr ) s
15040 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
15050 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
15060 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
15070 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
15080 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15090 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
150a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
150b0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
150c0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
150d0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
150e0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
150f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69  sqlite3SchemaWri
15100 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  table(pParse, iD
15110 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61  b);..  /* If pTa
15120 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
15130 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
15140 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
15150 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
15160 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
15170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
15180 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
15190 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
151a0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
151b0 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
151c0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
151d0 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
151e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
151f0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
15200 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
15210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
15220 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
15230 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
15240 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
15250 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
15260 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
15270 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
15280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15290 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
152a0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
152b0 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
152c0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
152d0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
152e0 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
152f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
15300 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15310 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
15320 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15330 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
15340 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15350 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15360 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
15370 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15380 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15390 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
153a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
153b0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
153c0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
153d0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
153e0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
153f0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
15400 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
15410 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15420 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
15430 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
15440 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
15450 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
15460 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
15470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
15480 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15490 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
154a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
154b0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
154c0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
154d0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
154e0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
154f0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15500 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
15510 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15520 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15530 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
15540 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
15550 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15560 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15570 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15580 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15590 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
155a0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
155b0 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
155c0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
155d0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
155e0 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
155f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15600 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15610 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
15620 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
15630 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15640 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15650 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
15660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15670 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
15680 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
15690 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
156a0 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
156b0 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
156c0 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
156d0 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
156e0 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
156f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15700 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15710 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
15720 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
15730 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
15740 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
15750 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15760 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
15770 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
15780 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15790 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
157a0 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
157b0 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
157c0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
157d0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
157e0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
157f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15800 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15810 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
15820 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
15830 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
15840 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
15850 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15860 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
15870 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
15880 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15890 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
158a0 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
158b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
158c0 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
158d0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
158e0 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
158f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15900 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
15910 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
15920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15930 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
15940 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
15950 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
15960 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
15970 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
15980 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
15990 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
159a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
159b0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
159c0 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
159d0 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
159e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
159f0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
15a00 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
15a10 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
15a20 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
15a30 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
15a40 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
15a50 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
15a60 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
15a70 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
15a80 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
15a90 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
15aa0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
15ab0 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
15ac0 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
15ad0 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
15ae0 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
15af0 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
15b00 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
15b10 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
15b20 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
15b30 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
15b40 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
15b50 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
15b60 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
15b70 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
15b80 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
15b90 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
15ba0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
15bb0 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
15bc0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
15bd0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
15be0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
15bf0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
15c00 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
15c10 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
15c20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
15c30 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
15c40 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
15c50 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
15c60 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
15c70 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
15c80 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
15c90 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
15ca0 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
15cb0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
15cc0 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
15cd0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15ce0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
15cf0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
15d00 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
15d10 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
15d20 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
15d30 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
15d40 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
15d50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
15d60 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
15d70 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
15d80 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
15d90 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
15da0 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
15db0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
15dc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
15dd0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
15de0 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
15df0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15e00 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
15e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15e20 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
15e30 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
15e40 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
15e50 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
15e60 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
15e70 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
15e80 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
15e90 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
15ea0 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
15eb0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
15ec0 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
15ed0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
15ee0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
15ef0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
15f00 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
15f10 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
15f20 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
15f30 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
15f40 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
15f50 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
15f60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15f70 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
15f80 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
15f90 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
15fa0 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
15fb0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
15fc0 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
15fd0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
15fe0 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
15ff0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
16000 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
16010 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
16020 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
16030 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
16040 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
16050 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16060 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
16070 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16080 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16090 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
160a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
160b0 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
160c0 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
160d0 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
160e0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
160f0 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
16100 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
16110 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
16120 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
16130 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
16140 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
16150 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
16160 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
16170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
16180 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
16190 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
161a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
161b0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
161c0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
161d0 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
161e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
161f0 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
16200 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
16210 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16220 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
16230 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
16240 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
16250 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
16260 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
16270 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
16280 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28  ->zTo = z;.  if(
16290 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
162a0 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
162b0 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
162c0 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
162d0 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pTo);.  }.  mem
162e0 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
162f0 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
16300 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
16310 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
16320 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
16330 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
16340 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
16350 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
16360 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
16370 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
16380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16390 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
163a0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
163b0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
163c0 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
163d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
163e0 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
163f0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
16400 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16410 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
16420 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16430 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
16440 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16460 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
16470 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
16480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16490 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
164a0 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
164b0 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
164c0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
164d0 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
164e0 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
164f0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
16500 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16510 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16520 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
16530 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16540 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
16550 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b  map(pParse, &pFK
16560 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72  ey->aCol[i], pFr
16570 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
16580 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16590 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
165a0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
165b0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
165c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
165d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
165e0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
165f0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
16600 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
16610 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f  z;.      if( IN_
16620 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
16630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16640 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
16650 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43  (pParse, z, pToC
16660 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
16680 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
16690 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
166a0 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
166b0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
166c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
166d0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
166e0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
166f0 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
16700 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
16710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
16720 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
16730 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
16740 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
16750 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
16760 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
16770 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
16780 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
16790 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
167a0 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
167b0 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
167c0 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
167d0 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
167e0 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
167f0 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
16800 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
16810 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
16820 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
16830 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
16840 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
16850 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
16860 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
16870 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
16880 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
16890 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
168a0 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
168b0 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
168c0 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
168d0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
168e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
168f0 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
16900 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
16910 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
16920 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
16930 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
16940 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
16950 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
16960 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16970 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
16980 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
16990 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
169a0 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
169b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
169c0 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
169d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
169e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
169f0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
16a00 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
16a10 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
16a20 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
16a30 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
16a40 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
16a50 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
16a60 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
16a70 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
16a80 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
16a90 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
16aa0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
16ab0 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
16ac0 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
16ad0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
16ae0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
16af0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
16b00 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
16b10 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
16b20 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
16b30 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
16b40 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
16b50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
16b60 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
16b70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
16b80 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
16b90 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
16ba0 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
16bb0 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
16bc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16bd0 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
16be0 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
16bf0 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
16c00 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
16c10 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
16c20 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
16c30 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
16c40 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16c50 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
16c60 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
16c70 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
16c80 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
16c90 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
16ca0 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
16cb0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
16cc0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
16cd0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
16ce0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
16cf0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
16d00 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
16d10 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
16d20 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
16d30 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
16d40 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
16d50 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
16d60 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
16d70 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
16d80 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
16d90 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16da0 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
16db0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
16dc0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
16dd0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
16de0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
16df0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
16e00 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
16e10 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
16e20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16e30 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
16e40 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
16e50 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
16e60 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
16e70 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
16e80 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
16e90 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
16ea0 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
16eb0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
16ec0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
16ed0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
16ee0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
16ef0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
16f00 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
16f10 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
16f20 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
16f30 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
16f40 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
16f50 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
16f60 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
16f70 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
16fa0 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
16fb0 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
16fc0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fe0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
16ff0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
17000 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17020 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
17030 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
17040 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
17050 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
17060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
17070 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
17080 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
17090 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
170a0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
170b0 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
170c0 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
170d0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
170e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
170f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
17100 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
17110 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
17120 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
17130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
17140 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
17150 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
17160 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
17170 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
17180 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
17190 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
171a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
171b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
171c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
171d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
171e0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
171f0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
17200 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
17210 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
17220 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17230 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
17240 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17250 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17260 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
17270 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
17280 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
17290 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
172a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
172b0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
172c0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
172d0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
172e0 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
172f0 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
17300 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
17310 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
17320 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
17330 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
17340 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17350 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
17360 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
17370 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
17380 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
17390 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
173a0 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
173b0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
173c0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
173d0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
173e0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
173f0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
17400 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
17410 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
17420 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
17430 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
17440 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
17450 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
17460 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
17470 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
17480 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17490 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
174a0 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
174b0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
174c0 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
174d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
174e0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
174f0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
17500 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
17510 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
17520 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
17530 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
17540 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
17550 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
17560 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
17570 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
17580 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
17590 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
175a0 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
175b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
175c0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
175d0 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
175e0 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
175f0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
17600 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17610 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74  );.  sqlite3Mult
17620 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a  iWrite(pParse);.
17630 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
17640 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
17650 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
17660 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
17670 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
17680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17690 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
176a0 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
176b0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
176c0 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
176d0 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
176e0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
176f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17700 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17710 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
17720 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17730 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
17740 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
17750 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
17760 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
17770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17780 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
17790 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
177a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
177b0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
177c0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
177e0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
177f0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
17800 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17810 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
17820 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
17830 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
17840 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
17850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17860 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
17870 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
17880 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
17890 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  (v);.  if( IsUni
178a0 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
178b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
178c0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
178d0 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  (v, 1);.    addr
178e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
178f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
17910 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c  rifyAbortable(v,
17920 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20   OE_Abort);.    
17930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17940 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
17950 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
17960 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
17970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17980 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
17990 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
179a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
179b0 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
179c0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
179d0 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
179e0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
179f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17a00 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  j2);.  }else{.  
17a10 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
17a20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17a30 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
17a40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17a50 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
17a60 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
17a70 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
17a80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17a90 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64   OP_SeekEnd, iId
17aa0 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
17ab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
17ac0 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
17ad0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
17ae0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17af0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
17b00 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
17b10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17b20 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
17b30 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
17b40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17b50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
17b60 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
17b70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17b80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17b90 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17ba0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17bb0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
17bc0 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
17bd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17be0 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
17bf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17c00 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
17c10 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
17c20 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
17c30 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
17c40 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
17c50 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
17c60 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
17c70 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
17c80 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
17c90 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
17ca0 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
17cb0 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
17cc0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17cd0 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
17ce0 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
17cf0 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
17d00 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
17d10 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
17d20 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
17d30 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
17d40 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
17d50 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
17d60 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
17d70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
17d80 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
17d90 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
17da0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
17db0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
17dc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17dd0 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
17de0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
17df0 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
17e00 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
17e10 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
17e20 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
17e30 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
17e40 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
17e50 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
17e60 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
17e70 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
17e80 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
17e90 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
17ea0 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
17eb0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
17ec0 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
17ed0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17ee0 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
17ef0 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
17f00 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
17f10 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
17f20 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
17f30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
17f40 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
17f50 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
17f60 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
17f70 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17f90 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
17fa0 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
17fb0 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
17fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17fd0 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
17fe0 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
17ff0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
18000 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
18010 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18020 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
18030 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
18040 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
18050 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
18060 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
18070 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
18080 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
18090 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70  char**)pExtra; p
180a0 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
180b0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
180c0 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
180d0 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
180e0 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
180f0 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
18100 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
18110 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
18120 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
18130 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
18140 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
18150 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
18160 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
18170 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
18180 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
18190 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
181a0 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
181b0 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
181c0 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
181d0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
181e0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
181f0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
18200 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
18210 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
18220 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
18230 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
18240 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18250 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
18260 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
18270 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
18280 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
18290 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
182a0 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
182b0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
182c0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
182d0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
182e0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
182f0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
18300 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
18310 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
18320 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
18330 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
18340 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
18350 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
18360 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
18370 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
18380 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
18390 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
183a0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
183b0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
183c0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
183d0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
183e0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
183f0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
18400 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
18410 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
18420 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
18430 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
18440 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
18450 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18460 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
18470 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18480 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
18490 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
184a0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
184b0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
184c0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
184d0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
184e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
184f0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
18500 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
18510 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
18520 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
18530 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
18540 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
18550 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
18560 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
18570 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
18580 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
18590 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
185a0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
185b0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
185c0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
185d0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
185e0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
185f0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
18600 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
18610 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
18620 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
18630 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
18640 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
18650 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18660 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
18670 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
18680 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
18690 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
186a0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
186b0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
186c0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
186d0 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
186e0 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
186f0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
18700 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
18710 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
18720 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
18730 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
18740 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
18750 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
18760 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
18770 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
18780 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
18790 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
187a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
187b0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
187c0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
187d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
187e0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
187f0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
18800 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
18810 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
18820 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
18830 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
18840 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
18850 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
18860 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
18870 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
18880 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
18890 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
188a0 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
188b0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
188c0 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
188d0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
188e0 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
188f0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
18900 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18910 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
18920 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
18930 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
18940 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
18950 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
18960 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
18970 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
18980 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
18990 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
189a0 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
189b0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
189c0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
189d0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
189e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
189f0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
18a00 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
18a10 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
18a40 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
18a50 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
18a60 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
18a70 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
18a80 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
18a90 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
18aa0 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
18ab0 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
18ac0 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
18ad0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18ae0 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
18af0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18b00 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
18b10 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
18b20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
18b40 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
18b50 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
18b60 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
18b70 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
18b80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18b90 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
18ba0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
18bb0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
18bc0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18bd0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18be0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
18bf0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
18c00 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
18c10 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
18c20 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
18c30 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
18c40 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
18c50 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
18c60 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
18c70 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
18c80 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
18c90 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
18ca0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
18cb0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
18cc0 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
18cd0 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
18ce0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
18cf0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18d00 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
18d10 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
18d20 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
18d30 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
18d40 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
18d50 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
18d60 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
18d70 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
18d80 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
18d90 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
18da0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18db0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
18dc0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
18dd0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
18de0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
18df0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
18e00 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
18e10 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
18e20 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
18e30 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
18e40 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
18e50 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
18e60 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
18e70 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18e80 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
18e90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
18ea0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
18eb0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
18ec0 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
18ed0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
18ee0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
18ef0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
18f00 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
18f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
18f20 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
18f30 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
18f40 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
18f50 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
18f60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
18f70 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
18f80 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
18f90 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
18fa0 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
18fb0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
18fc0 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
18fd0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
18fe0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
18ff0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
19000 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
19010 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
19020 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
19030 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
19040 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
19050 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
19060 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19070 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
19080 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
19090 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
190a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
190b0 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
190c0 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
190d0 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
190e0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
190f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19100 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
19110 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
19120 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
19130 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
19140 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
19150 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
19160 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
19170 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19180 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
19190 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
191a0 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
191b0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
191c0 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
191d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
191e0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
191f0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
19200 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
19210 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
19220 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
19230 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19240 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
19250 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
19260 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
19270 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
19280 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
19290 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
192a0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
192b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
192c0 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
192d0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
192e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
192f0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
19300 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
19310 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
19320 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
19330 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
19340 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
19350 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
19360 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69  me)==0.#endif.#i
19370 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
19380 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f  W_SQLITE_MASTER_
19390 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26 26 20  INDEX.       && 
193a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26  sqlite3StrICmp(&
193b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
193c0 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64  master")!=0.#end
193d0 69 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  if.       && sql
193e0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54  ite3StrNICmp(&pT
193f0 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c  ab->zName[7],"al
19400 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 0a 20  tertab_",9)!=0. 
19410 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
19420 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19430 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
19440 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
19450 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19460 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19470 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
19480 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19490 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
194a0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
194b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
194c0 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
194d0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
194e0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
194f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19500 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
19510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19520 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
19530 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19540 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
19550 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19560 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
19570 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
19580 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
19590 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
195a0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
195b0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
195c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
195d0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
195e0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
195f0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
19600 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
19610 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
19620 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
19630 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
19640 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
19650 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
19660 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
19670 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
19680 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
19690 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
196a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
196b0 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
196c0 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
196d0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
196e0 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
196f0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
19700 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
19710 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
19720 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
19730 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
19740 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
19750 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
19760 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
19770 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
19780 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
19790 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
197a0 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
197b0 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
197c0 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
197d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
197e0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
197f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
19800 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
19810 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
19820 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
19830 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19840 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
19850 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
19860 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
19870 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
19880 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
19890 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
198a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
198b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
198c0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
198d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64   ){.      if( !d
198e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
198f0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
19900 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
19910 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
19920 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19930 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19940 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
19950 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
19960 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
19970 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
19980 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19990 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
199a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
199b0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
199c0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
199d0 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  DbSName)!=0 ){. 
199e0 20 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f         if( !ifNo
199f0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
19a00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19a10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
19a20 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
19a30 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
19a40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19a50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19a60 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
19a70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19a80 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
19a90 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
19aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19ab0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19ac0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19ad0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
19ae0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
19af0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
19b00 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
19b10 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
19b20 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
19b30 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
19b40 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
19b50 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
19b60 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
19b70 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
19b80 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
19b90 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
19ba0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19bb0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74     }..    /* Aut
19bd0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
19be0 65 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  es generated fro
19bf0 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  m within sqlite3
19c00 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a  _declare_vtab().
19c10 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65      ** must have
19c20 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
19c30 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f  distinct from no
19c40 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69  rmal automatic i
19c50 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20  ndex names..    
19c60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19c70 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65   statement conve
19c80 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74  rts "sqlite3_aut
19c90 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a  oindex..." into.
19ca0 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f      ** "sqlite3_
19cb0 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  butoindex..." in
19cc0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74   order to make t
19cd0 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63  he names distinc
19ce0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76  t..    ** The "v
19cf0 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65  tab_err.test" te
19d00 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20  st demonstrates 
19d10 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73  the need of this
19d20 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
19d30 20 20 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41     if( IN_SPECIA
19d40 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b  L_PARSE ) zName[
19d50 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  7]++;.  }..  /* 
19d60 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
19d70 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
19d80 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
19d90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19da0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
19db0 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  ON.  if( !IN_REN
19dc0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
19dd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19de0 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  b = pDb->zDbSNam
19df0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
19e00 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
19e10 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
19e20 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
19e30 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
19e40 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19e50 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19e60 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
19e70 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
19e80 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
19e90 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
19ea0 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
19eb0 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
19ec0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19ed0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
19ee0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
19ef0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
19f00 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19f10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19f20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
19f30 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
19f40 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
19f50 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
19f60 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
19f70 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
19f80 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
19f90 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
19fa0 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
19fb0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
19fc0 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
19fd0 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
19fe0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
19ff0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1a000 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43  .    Token prevC
1a010 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ol;.    Column *
1a020 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1a030 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
1a040 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
1a050 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
1a060 55 4e 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69  UNIQUE;.    sqli
1a070 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72  te3TokenInit(&pr
1a080 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  evCol, pCol->zNa
1a090 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
1a0a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a0b0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1a0c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a0d0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
1a0e0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65  (db, TK_ID, &pre
1a0f0 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69  vCol, 0));.    i
1a100 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
1a110 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a120 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a130 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
1a140 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
1a150 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
1a160 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74  rder(pList, sort
1a170 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Order);.  }else{
1a180 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a190 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
1a1a0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22  pParse, pList, "
1a1b0 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20  index");.  }..  
1a1c0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a1d0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
1a1e0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
1a1f0 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
1a200 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
1a210 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
1a220 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
1a230 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1a240 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1a250 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1a260 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
1a270 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
1a280 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
1a290 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
1a2a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1a2b0 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
1a2c0 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
1a2d0 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1a2e0 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
1a2f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
1a300 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
1a310 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
1a320 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
1a330 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a340 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
1a350 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
1a360 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
1a370 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1a380 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
1a390 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
1a3a0 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
1a3b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
1a3e0 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
1a3f0 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
1a400 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1a410 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a420 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a430 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1a440 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1a450 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
1a460 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
1a470 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1a480 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
1a490 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
1a4a0 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
1a4b0 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
1a4c0 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
1a4d0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
1a4e0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
1a4f0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
1a500 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
1a510 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
1a520 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
1a530 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1a540 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
1a550 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
1a560 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79  >idxType = idxTy
1a570 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  pe;.  pIndex->pS
1a580 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
1a590 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
1a5a0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1a5b0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1a5c0 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
1a5d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1a5e0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1a5f0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1a600 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
1a610 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
1a620 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
1a630 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
1a640 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
1a650 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a660 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1a670 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1a680 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
1a690 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
1a6a0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
1a6b0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
1a6c0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
1a6d0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
1a6e0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
1a6f0 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
1a700 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
1a710 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
1a720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
1a730 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
1a740 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
1a750 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
1a760 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
1a770 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
1a780 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
1a790 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
1a7a0 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
1a7b0 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
1a7c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1a7d0 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
1a7e0 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
1a7f0 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
1a800 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
1a810 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
1a820 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
1a830 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
1a840 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
1a850 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1a860 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
1a870 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
1a880 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
1a890 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
1a8a0 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
1a8b0 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
1a8c0 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
1a8d0 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
1a8e0 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
1a8f0 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
1a900 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
1a910 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
1a920 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
1a930 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74  ey..  */.  pList
1a940 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1a950 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
1a960 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70  _OBJECT ){.    p
1a970 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1a980 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69  = pList;.    pLi
1a990 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  st = 0;.  }.  fo
1a9a0 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
1a9b0 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70  >nKeyCol; i++, p
1a9c0 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
1a9d0 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20   Expr *pCExpr;  
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65  /* The i-th inde
1aa00 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
1aa10 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
1aa20 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  dSortOrder;     
1aa30 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
1aa40 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78  C on the i-th ex
1aa50 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1aa60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1aa70 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1aa80 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
1aa90 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
1aaa0 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
1aab0 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  oId(pListItem->p
1aac0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
1aad0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1aae0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1aaf0 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Tab, NC_IdxExpr,
1ab00 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1ab10 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
1ab20 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
1ab30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ab40 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72  ndex;.    pCExpr
1ab50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1ab60 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49  ipCollate(pListI
1ab70 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1ab80 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21   if( pCExpr->op!
1ab90 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1aba0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50      if( pTab==pP
1abb0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1abc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1abd0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1abe0 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20  e, "expressions 
1abf0 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
1ac00 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a  IMARY KEY and ".
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac30 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  "UNIQUE constrai
1ac40 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67  nts");.        g
1ac50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1ac60 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1ac70 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
1ac80 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a  >aColExpr==0 ){.
1ac90 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1aca0 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74  aColExpr = pList
1acb0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
1acc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1acd0 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
1ace0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1acf0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
1ad00 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1ad10 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1ad20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ad30 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
1ad40 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1ad50 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
1ad60 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
1ad70 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
1ad80 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
1ad90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1ada0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
1adb0 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1adc0 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1add0 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1ade0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1adf0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1ae00 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
1ae10 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1ae20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
1ae30 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1ae40 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
1ae50 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
1ae60 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
1ae70 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
1ae80 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
1ae90 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1aea0 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
1aeb0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
1aec0 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
1aed0 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
1aee0 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
1aef0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
1af00 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
1af10 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
1af20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
1af30 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
1af40 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
1af50 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
1af60 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1af70 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
1af80 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
1af90 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1afa0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1afb0 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
1afc0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1afd0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
1afe0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1aff0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b000 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
1b010 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
1b020 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
1b030 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
1b040 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
1b050 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
1b060 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
1b070 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
1b080 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
1b090 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
1b0a0 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
1b0b0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
1b0c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1b0d0 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
1b0e0 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
1b0f0 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
1b100 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
1b110 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
1b120 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
1b130 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
1b140 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
1b150 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
1b160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
1b170 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
1b180 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1b190 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1b1a0 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
1b1b0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
1b1c0 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
1b1d0 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
1b1e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b1f0 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
1b200 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
1b210 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1b220 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1b230 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1b240 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b250 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
1b260 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
1b270 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
1b280 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1b290 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1b2a0 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1b2b0 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1b2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b2d0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1b2e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1b2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1b300 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1b310 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1b320 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b330 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1b340 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1b350 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1b360 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1b370 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1b380 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1b390 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1b3a0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1b3b0 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1b3c0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1b3d0 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1b3e0 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1b3f0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1b400 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1b410 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1b420 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1b430 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1b440 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1b450 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1b460 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d  y)>=0 );.  recom
1b470 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
1b480 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b 0a 20  dexed(pIndex);. 
1b490 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1b4a0 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   && pIndex->nCol
1b4b0 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn>=pTab->nCol 
1b4c0 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69  ){.    pIndex->i
1b4d0 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
1b4e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1b4f0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1b500 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1b510 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
1b520 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
1b530 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1b540 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30  dex(pIndex,j)>=0
1b550 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b560 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1b570 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  ering = 0;.     
1b580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b590 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  }..  if( pTab==p
1b5a0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1b5b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1b5c0 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
1b5d0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
1b5e0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
1b5f0 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
1b600 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
1b610 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1b620 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
1b630 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1b640 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
1b650 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1b660 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
1b670 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
1b680 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
1b690 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
1b6a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1b6b0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
1b6c0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1b6d0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1b6e0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
1b6f0 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
1b700 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
1b710 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
1b720 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
1b730 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
1b740 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
1b750 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
1b760 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
1b770 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
1b780 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
1b790 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1b7a0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
1b7b0 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
1b7c0 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
1b7d0 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
1b7e0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
1b7f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
1b800 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1b810 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
1b820 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1b830 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
1b840 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
1b850 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
1b860 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
1b870 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
1b880 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
1b890 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
1b8a0 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
1b8b0 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
1b8c0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
1b8d0 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
1b8e0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
1b8f0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
1b900 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
1b910 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
1b920 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
1b930 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1b940 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
1b950 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
1b960 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
1b970 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
1b980 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1b990 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1b9a0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1b9b0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
1b9c0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
1b9d0 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1b9e0 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20  dex(pIdx) );.   
1b9f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1ba00 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1ba10 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1ba20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ba30 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1ba40 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20  Index) );..     
1ba50 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
1ba60 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ol!=pIndex->nKey
1ba70 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
1ba80 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1ba90 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
1baa0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
1bab0 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
1bac0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1bad0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73   *z2;.        as
1bae0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1baf0 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[k]>=0 );.  
1bb00 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1bb10 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
1bb20 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
1bb30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1bb40 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43    z1 = pIdx->azC
1bb50 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1bb60 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
1bb70 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1bb80 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1bb90 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1bba0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1bbb0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1bbc0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1bbd0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1bbe0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1bbf0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1bc00 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1bc10 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1bc20 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1bc30 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1bc40 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1bc50 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1bc60 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1bc70 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1bc80 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1bc90 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1bca0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1bcb0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1bcc0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1bcd0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1bce0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1bcf0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1bd00 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1bd10 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1bd20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1bd30 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1bd40 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1bd50 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1bd60 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1bd70 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1bd80 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1bd90 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1bda0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1bdb0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1bdc0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1bdd0 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1bde0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1bdf0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1be00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1be10 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1be20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1be30 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1be40 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1be50 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1be60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be70 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1be80 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1be90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1bea0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1beb0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1bec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bed0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1bee0 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  ( idxType==SQLIT
1bef0 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
1bf00 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78  YKEY ) pIdx->idx
1bf10 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1bf20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1bf30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1bf40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bf50 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  }..  if( !IN_REN
1bf60 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20  AME_OBJECT ){.. 
1bf70 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
1bf80 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1bf90 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1bfa0 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1bfb0 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  .    ** in-memor
1bfc0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1bfd0 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20  tures. .    */. 
1bfe0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1bff0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1c000 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1c010 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
1c020 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73  ex *p;.      ass
1c030 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c  ert( !IN_SPECIAL
1c040 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20  _PARSE );.      
1c050 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1c060 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1c070 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1c080 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
1c090 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1c0a0 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1c0b0 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1c0c0 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64   .          pInd
1c0d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1c0e0 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20  x);.      if( p 
1c0f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c100 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1c110 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1c120 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1c130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
1c140 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1c150 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c160 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c170 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44    }.      db->mD
1c180 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1c190 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1c1a0 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d       if( pTblNam
1c1b0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
1c1c0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1c1d0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1c1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c1f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c200 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1c210 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1c220 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1c230 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 20  TABLE if the.   
1c240 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1c250 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1c260 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1c270 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1c280 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20 2a  aint) then.    *
1c290 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1c2a0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1c2b0 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1c2c0 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1c2d0 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ntry for.    ** 
1c2e0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1c2f0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1c300 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1c310 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1c320 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  .    ** content.
1c330 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f    But, do not do
1c340 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20   this if we are 
1c350 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74  simply reading t
1c360 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1c370 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  .    ** table to
1c380 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1c390 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1c3a0 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1c3b0 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 20  RY KEY index.   
1c3c0 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1c3d0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1c3e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1c3f0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1c400 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1c410 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1c420 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1c430 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20  Y KEY.    ** or 
1c440 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1c450 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1c460 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1c470 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
1c480 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1c490 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1c4a0 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1c4b0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1c4c0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  alization.    **
1c4d0 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1c4e0 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
1c4f0 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77   else if( HasRow
1c500 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c  id(pTab) || pTbl
1c510 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1c520 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20 20   Vdbe *v;.      
1c530 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1c540 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1c550 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1c560 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33       v = sqlite3
1c570 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1c580 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20  .      if( v==0 
1c590 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1c5a0 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20  te_index;..     
1c5b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1c5c0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1c5d0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1c5e0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1c5f0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1c600 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1c610 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1c620 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
1c630 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61  doing so, code a
1c640 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f   Noop instructio
1c650 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20  n and store its 
1c660 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20  address in .    
1c670 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1c680 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1c690 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1c6a0 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1c6b0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52 49   a .      ** PRI
1c6c0 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1c6d0 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1c6e0 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1c6f0 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1c700 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1c710 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1c720 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1c730 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1c740 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20  eplace.      ** 
1c750 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1c760 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1c770 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1c780 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1c790 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65 78   */.      pIndex
1c7a0 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  ->tnum = sqlite3
1c7b0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1c7c0 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  _Noop);.      sq
1c7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1c7e0 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
1c7f0 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54  e, iDb, iMem, BT
1c800 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20  REE_BLOBKEY);.. 
1c810 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74       /* Gather t
1c820 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1c830 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1c840 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1c850 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nto.      ** the
1c860 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
1c870 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1c880 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1c890 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1c8a0 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
1c8b0 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
1c8c0 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
1c8d0 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
1c8e0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
1c8f0 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
1c900 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e  ;.        /* A n
1c910 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1c920 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1c930 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1c940 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  nt */.        zS
1c950 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1c960 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1c970 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1c980 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72              onEr
1c990 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
1c9a0 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e  " : " UNIQUE", n
1c9b0 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
1c9c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c9d0 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1c9e0 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1c9f0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1ca00 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1ca10 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  raint */.       
1ca20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
1ca30 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
1ca40 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  */.        zStmt
1ca50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
1ca60 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65       /* Add an e
1ca70 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1ca80 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1ca90 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ndex.      */.  
1caa0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1cab0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
1cac0 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1cad0 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1cae0 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1caf0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1cb00 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1cb10 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1cb20 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
1cb30 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1cb40 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54  me,.          pT
1cb50 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1cb60 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
1cb70 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20       zStmt.     
1cb80 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
1cb90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cba0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f  zStmt);..      /
1cbb0 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1cbc0 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1cbd0 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1cbe0 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1cbf0 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  pire.      ** to
1cc00 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1cc10 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1cc20 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a  tements..      *
1cc30 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c  /.      if( pTbl
1cc40 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1cc50 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1cc60 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1cc70 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1cc80 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1cc90 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1cca0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
1ccb0 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
1ccc0 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20  chemaOp(pParse, 
1ccd0 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1cce0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1ccf0 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41  db, "name='%q' A
1cd00 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1cd10 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1cd20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1cd30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cd40 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29  OP_Expire, 0, 1)
1cd50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1cd60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1cd70 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1cd80 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tnum);.    }.  }
1cd90 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1cda0 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1cdb0 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1cdc0 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1cdd0 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1cde0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1cdf0 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1ce00 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1ce10 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1ce20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1ce30 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1ce40 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1ce50 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1ce60 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1ce70 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1ce80 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1ce90 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1cea0 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1ceb0 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1cec0 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1ced0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1cee0 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1cef0 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1cf00 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1cf10 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1cf20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1cf30 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1cf40 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1cf50 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1cf60 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1cf70 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1cf80 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1cf90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cfa0 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1cfb0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1cfc0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1cfd0 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1cfe0 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1cff0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1d000 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1d010 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1d020 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1d030 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1d040 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1d050 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1d060 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1d070 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
1d080 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  = 0;.  }.  else 
1d090 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1d0a0 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  JECT ){.    asse
1d0b0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
1d0c0 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1d0d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1d0e0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1d0f0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1d100 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1d110 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1d120 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1d130 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1d140 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e   ) sqlite3FreeIn
1d150 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1d160 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1d170 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1d180 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1d190 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1d1a0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1d1b0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1d1c0 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1d1d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d1e0 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zName);.}../*.
1d1f0 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
1d200 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
1d210 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
1d220 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
1d230 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
1d240 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
1d250 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
1d260 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1d270 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
1d280 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20  [0] is supposed 
1d290 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1d2a0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1d2b0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1d2c0 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1d2d0 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1d2e0 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1d2f0 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1d300 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1d310 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1d320 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1d330 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1d340 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1d350 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1d360 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1d370 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1d380 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1d390 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1d3a0 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1d3b0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1d3c0 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
1d3d0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
1d3e0 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
1d3f0 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
1d400 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
1d410 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
1d420 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
1d430 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
1d440 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
1d450 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1d460 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
1d470 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
1d480 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
1d490 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
1d4a0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
1d4b0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
1d4c0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
1d4d0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
1d4e0 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
1d4f0 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
1d500 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
1d510 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
1d520 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
1d530 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
1d540 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
1d550 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20   *pIdx){.  /*   
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c               10,
1d570 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20    9,  8,  7,  6 
1d580 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c  */.  LogEst aVal
1d590 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33  [] = { 33, 32, 3
1d5a0 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c  0, 28, 26 };.  L
1d5b0 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d  ogEst *a = pIdx-
1d5c0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  >aiRowLogEst;.  
1d5d0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
1d5e0 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c  ArraySize(aVal),
1d5f0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
1d600 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1d610 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66  Indexes with def
1d620 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74  ault row estimat
1d630 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  es should not ha
1d640 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f  ve stat1 data */
1d650 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78  .  assert( !pIdx
1d660 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20  ->hasStat1 );.. 
1d670 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
1d680 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20  t entry (number 
1d690 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
1d6a0 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74  ndex) to the est
1d6b0 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d  imated .  ** num
1d6c0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1d6d0 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c  he table, or hal
1d6e0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1d6f0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1d700 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72  e.  ** for a par
1d710 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75  tial index.   Bu
1d720 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  t do not let the
1d730 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62   estimate drop b
1d740 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b  elow 10. */.  a[
1d750 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1d760 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1d770 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
1d780 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b  IdxWhere!=0 ) a[
1d790 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72  0] -= 10;  asser
1d7a0 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
1d7b0 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28  gEst(2) );.  if(
1d7c0 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1d7d0 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 33;           
1d7e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1d7f0 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1d800 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1d810 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1d820 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1d830 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1d840 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1d850 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1d860 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1d870 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1d880 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1d890 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1d8a0 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1d8b0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1d8c0 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1d8d0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1d8e0 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1d900 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1d910 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1d920 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1d930 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1d940 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1d950 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1d960 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1d970 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1d980 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1d990 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1d9a0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1d9b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1d9c0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1d9d0 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1d9e0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1d9f0 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1da00 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1da10 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1da20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1da30 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1da40 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1da50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1da60 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1da70 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1da80 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1da90 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1daa0 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1dab0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1dac0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1dad0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1dae0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1daf0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1db00 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1db10 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1db20 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1db30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1db40 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1db50 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1db60 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1db70 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1db80 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1db90 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1dba0 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1dbb0 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1dbc0 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1dbd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1dbe0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1dbf0 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1dc00 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1dc10 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1dc20 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1dc30 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1dc40 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1dc50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1dc60 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1dc70 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1dc80 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1dc90 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1dca0 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1dcb0 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1dcc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1dcd0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1dce0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1dcf0 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1dd00 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1dd10 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1dd20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1dd30 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1dd40 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1dd50 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1dd60 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1dd70 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1dd80 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
1dd90 65 33 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65  e3SchemaWritable
1dda0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 23  (pParse, iDb);.#
1ddb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ddc0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1ddd0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1dde0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1ddf0 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
1de00 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
1de10 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
1de20 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1de30 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
1de40 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
1de50 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
1de60 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
1de70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1de80 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1de90 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
1dea0 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
1deb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1dec0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1ded0 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
1dee0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29  _TEMPDB && iDb )
1def0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1df00 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
1df10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1df20 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1df30 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
1df40 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
1df50 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
1df60 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1df70 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
1df80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
1df90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1dfa0 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
1dfb0 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
1dfc0 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
1dfd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1dfe0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1dff0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1e000 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1e010 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
1e020 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1e030 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1e040 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
1e050 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
1e060 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44  HERE name=%Q AND
1e070 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a   type='index'",.
1e080 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1e090 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1e0a0 53 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65  STER_NAME, pInde
1e0b0 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
1e0c0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
1e0d0 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
1e0e0 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
1e0f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
1e100 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1e110 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1e120 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
1e130 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
1e140 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
1e150 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1e160 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1e170 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
1e180 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
1e190 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
1e1a0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
1e1b0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1e1c0 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
1e1d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
1e1e0 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
1e1f0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
1e200 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a  bjects. Each obj
1e210 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
1e220 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
1e230 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
1e240 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20  is routine uses 
1e250 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1e260 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20  ().** to extend 
1e270 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61  the array so tha
1e280 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65  t there is space
1e290 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63   for a new objec
1e2a0 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  t at the end..**
1e2b0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
1e2c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e2d0 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61  , *pnEntry conta
1e2e0 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ins the current 
1e2f0 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61  size of.** the a
1e300 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73  rray (in entries
1e310 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61   - so the alloca
1e320 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74  tion is ((*pnEnt
1e330 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62  ry) * szEntry) b
1e340 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c  ytes.** in total
1e350 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1e360 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63  realloc() is suc
1e370 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66  cessful (i.e. if
1e380 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   no OOM conditio
1e390 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a  n occurs), the.*
1e3a0 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * space allocate
1e3b0 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62  d for the new ob
1e3c0 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20  ject is zeroed, 
1e3d0 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64  *pnEntry updated
1e3e0 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74   to.** reflect t
1e3f0 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
1e400 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70  he array and a p
1e410 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1e420 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  w allocation.** 
1e430 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20  returned. *pIdx 
1e440 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
1e450 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61  dex of the new a
1e460 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68  rray entry in th
1e470 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  is case..**.** O
1e480 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1e490 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73   realloc() fails
1e4a0 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  , *pIdx is set t
1e4b0 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72  o -1, *pnEntry r
1e4c0 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e  emains.** unchan
1e4d0 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ged and a copy o
1e4e0 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65  f pArray returne
1e4f0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1e500 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1e510 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1e520 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1e530 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1e540 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1e550 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
1e560 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
1e570 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
1e580 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
1e590 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
1e5a0 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
1e5b0 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
1e5c0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
1e5d0 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
1e5e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e5f0 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
1e600 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
1e610 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
1e620 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1e630 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
1e640 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
1e650 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
1e660 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1e670 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1e680 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  0 ){.    int sz 
1e690 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32  = (n==0) ? 1 : 2
1e6a0 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  *n;.    void *pN
1e6b0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1e6c0 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
1e6d0 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  , sz*szEntry);. 
1e6e0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e6f0 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
1e700 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1e710 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
1e720 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
1e730 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1e740 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
1e750 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74  set(&z[n * szEnt
1e760 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
1e770 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20  ;.  *pIdx = n;. 
1e780 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72   ++*pnEntry;.  r
1e790 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a  eturn pArray;.}.
1e7a0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1e7b0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1e7c0 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
1e7d0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
1e7e0 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
1e7f0 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
1e800 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
1e810 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1e820 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1e830 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
1e840 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50  e3IdListAppend(P
1e850 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64  arse *pParse, Id
1e860 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
1e870 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73  en *pToken){.  s
1e880 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1e890 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1e8a0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1e8b0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1e8c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1e8d0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
1e8e0 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
1e8f0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1e900 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1e910 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
1e920 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1e930 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
1e940 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
1e950 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
1e960 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  ),.      &pList-
1e970 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20  >nId,.      &i. 
1e980 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b   );.  if( i<0 ){
1e990 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1e9a0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1e9b0 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1e9c0 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1e9d0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
1e9e0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1e9f0 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
1ea00 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1ea10 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e  BJECT && pList->
1ea20 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
1ea30 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
1ea40 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
1ea50 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b  (void*)pList->a[
1ea60 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e  i].zName, pToken
1ea70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ea80 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1ea90 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
1eaa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1eab0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71  3IdListDelete(sq
1eac0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1ead0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1eae0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1eaf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1eb00 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1eb10 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1eb20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1eb30 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
1eb40 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
1eb50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1eb60 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
1eb70 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
1eb80 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1eb90 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1eba0 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
1ebb0 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
1ebc0 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
1ebd0 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
1ebe0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1ebf0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
1ec00 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
1ec10 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1ec20 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1ec30 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1ec40 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
1ec50 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1ec60 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1ec70 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
1ec80 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
1ec90 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
1eca0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1ecb0 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
1ecc0 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
1ecd0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1ece0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
1ecf0 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
1ed00 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
1ed10 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
1ed20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
1ed30 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
1ed40 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
1ed50 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
1ed60 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
1ed70 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
1ed80 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
1ed90 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
1eda0 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
1edb0 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
1edc0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
1edd0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ede0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1edf0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
1ee00 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
1ee10 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
1ee20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
1ee30 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
1ee40 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
1ee50 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
1ee60 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
1ee70 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
1ee80 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1ee90 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
1eea0 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
1eeb0 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
1eec0 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
1eed0 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
1eee0 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
1eef0 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
1ef00 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
1ef10 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
1ef20 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
1ef30 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1ef40 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
1ef50 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
1ef60 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
1ef70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
1ef80 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
1ef90 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
1efa0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1efb0 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
1efc0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1efd0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1efe0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1eff0 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
1f000 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1f010 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
1f020 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
1f030 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
1f040 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
1f050 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
1f060 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
1f070 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
1f080 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
1f090 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
1f0a0 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
1f0b0 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
1f0c0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
1f0d0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
1f0e0 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
1f0f0 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
1f100 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
1f110 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1f120 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
1f130 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
1f140 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
1f150 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
1f160 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
1f170 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
1f180 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33  ded */.  if( (u3
1f190 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  2)pSrc->nSrc+nEx
1f1a0 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
1f1b0 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
1f1c0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
1f1d0 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
1f1e0 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20  rc*2+nExtra;.   
1f1f0 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
1f200 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1f210 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1f220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f230 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1f240 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1f250 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1f260 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1f270 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1f280 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f290 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
1f2a0 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
1f2b0 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
1f2c0 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
1f2d0 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
1f2e0 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1f2f0 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1f300 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1f310 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1f320 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20  c = nGot;.  }.. 
1f330 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e   /* Move existin
1f340 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d  g slots that com
1f350 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c  e after the newl
1f360 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73  y inserted slots
1f370 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65  .  ** out of the
1f380 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d   way */.  for(i=
1f390 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  pSrc->nSrc-1; i>
1f3a0 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20  =iStart; i--){. 
1f3b0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78     pSrc->a[i+nEx
1f3c0 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69  tra] = pSrc->a[i
1f3d0 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e  ];.  }.  pSrc->n
1f3e0 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a  Src += nExtra;..
1f3f0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
1f400 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
1f410 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
1f420 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
1f430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
1f440 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
1f450 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
1f460 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
1f470 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
1f480 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
1f490 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
1f4a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f4b0 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
1f4c0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
1f4d0 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
1f4e0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1f4f0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
1f500 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1f510 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1f520 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
1f530 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
1f540 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
1f550 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
1f560 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
1f570 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
1f580 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
1f590 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
1f5a0 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
1f5b0 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
1f5c0 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
1f5d0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
1f5e0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
1f5f0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
1f600 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
1f610 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
1f620 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
1f630 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
1f640 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
1f650 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
1f660 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
1f670 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
1f680 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
1f690 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
1f6a0 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
1f6b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1f6c0 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
1f6d0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
1f6e0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
1f6f0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
1f700 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
1f710 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
1f720 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
1f730 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
1f740 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
1f750 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f760 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
1f770 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
1f780 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
1f790 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
1f7a0 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
1f7b0 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
1f7c0 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
1f7d0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
1f7e0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
1f7f0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
1f800 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
1f810 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1f820 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
1f830 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
1f840 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
1f850 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
1f860 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
1f870 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
1f880 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
1f890 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1f8a0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1f8b0 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
1f8c0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
1f8d0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
1f8e0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
1f8f0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
1f900 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
1f910 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1f920 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1f930 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
1f940 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
1f950 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
1f960 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
1f970 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
1f980 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
1f990 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
1f9a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1f9b0 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
1f9c0 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
1f9d0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1f9e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1f9f0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
1fa00 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
1fa10 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
1fa20 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
1fa30 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
1fa40 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
1fa50 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
1fa60 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
1fa70 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1fa80 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
1fa90 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1faa0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1fab0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1fac0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1fad0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
1fae0 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
1faf0 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
1fb00 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
1fb10 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
1fb20 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1fb30 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
1fb40 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
1fb50 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1fb60 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1fb70 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
1fb80 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
1fb90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1fba0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
1fbb0 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
1fbc0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
1fbd0 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
1fbe0 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t B */.  assert(
1fbf0 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
1fc00 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1fc10 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1fc20 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
1fc30 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29   sizeof(SrcList)
1fc40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1fc50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1fc60 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
1fc70 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73  oc = 1;.    pLis
1fc80 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20  t->nSrc = 1;.   
1fc90 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e   memset(&pList->
1fca0 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[0], 0, sizeof(
1fcb0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
1fcc0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69     pList->a[0].i
1fcd0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1fce0 65 6c 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20  else{.    pList 
1fcf0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1fd00 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
1fd10 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
1fd20 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  c);.  }.  if( db
1fd30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1fd40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  {.    sqlite3Src
1fd50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1fd60 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1fd70 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  n 0;.  }.  pItem
1fd80 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
1fd90 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69  st->nSrc-1];.  i
1fda0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
1fdb0 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20  pDatabase->z==0 
1fdc0 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  ){.    pDatabase
1fdd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1fde0 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20  pDatabase ){.   
1fdf0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
1fe00 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1fe10 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
1fe20 73 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  se);.    pItem->
1fe30 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
1fe40 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1fe50 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
1fe60 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d  }else{.    pItem
1fe70 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1fe80 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1fe90 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, pTable);.    
1fea0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1feb0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1fec0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1fed0 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
1fee0 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
1fef0 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
1ff00 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
1ff10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1ff20 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1ff30 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1ff40 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1ff50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1ff60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ff70 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1ff80 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
1ff90 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1ffa0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
1ffb0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
1ffc0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1ffd0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
1ffe0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1fff0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
20000 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
20010 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
20020 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
20030 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
20040 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
20050 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
20060 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20070 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
20080 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
20090 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
200a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
200b0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
200c0 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
200d0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
200e0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
200f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20100 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
20110 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
20120 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
20130 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
20140 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20150 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
20160 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
20170 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
20180 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
20190 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
201a0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
201b0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
201c0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
201d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
201e0 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
201f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
20200 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
20210 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
20220 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
20230 78 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44  xedBy ) sqlite3D
20240 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
20250 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
20260 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
20270 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73  fg.isTabFunc ) s
20280 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
20290 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
202a0 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
202b0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
202c0 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
202d0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
202e0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
202f0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
20300 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
20310 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
20320 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
20330 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
20340 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
20350 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
20360 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
20370 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
20380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
20390 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
203a0 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
203b0 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
203c0 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
203d0 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
203e0 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
203f0 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
20400 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
20410 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
20420 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
20430 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
20440 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
20450 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
20460 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
20470 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
20480 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
20490 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
204a0 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
204b0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
204c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
204d0 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
204e0 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
204f0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
20500 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
20510 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
20520 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
20530 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c  e term has an al
20540 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73  ias, then pAlias
20550 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
20560 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20  * alias token.  
20570 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  If the term is a
20580 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20   subquery, then 
20590 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65  pSubquery is the
205a0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
205b0 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75  ment that the su
205c0 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20  bquery encodes. 
205d0 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a   The pTable and.
205e0 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72  ** pDatabase par
205f0 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c  ameters are NULL
20600 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e   for subqueries.
20610 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55    The pOn and pU
20620 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sing.** paramete
20630 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65  rs are the conte
20640 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64  nt of the ON and
20650 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a   USING clauses..
20660 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  **.** Return a n
20670 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68  ew SrcList which
20680 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20   encodes is the 
20690 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65  FROM with the ne
206a0 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e  w.** term added.
206b0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
206c0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
206d0 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72  dFromTerm(.  Par
206e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
206f0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
20700 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
20710 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20  List *p,        
20720 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
20730 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f   part of the FRO
20740 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  M clause already
20750 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e   seen */.  Token
20760 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20   *pTable,       
20770 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20780 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74  e table to add t
20790 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  o the FROM claus
207a0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  e */.  Token *pD
207b0 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f  atabase,       /
207c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
207d0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
207e0 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  g pTable */.  To
207f0 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20  ken *pAlias,    
20800 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
20810 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
20820 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73  the AS subexpres
20830 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  sion */.  Select
20840 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20   *pSubquery,    
20850 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20    /* A subquery 
20860 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
20870 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f   a table name */
20880 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20  .  Expr *pOn,   
20890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
208a0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
208b0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73   join */.  IdLis
208c0 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20  t *pUsing       
208d0 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20     /* The USING 
208e0 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
208f0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
20900 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
20910 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
20920 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20930 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f  .  if( !p && (pO
20940 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a  n || pUsing) ){.
20950 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
20960 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a  Msg(pParse, "a J
20970 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65  OIN clause is re
20980 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73  quired before %s
20990 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f  ", .      (pOn ?
209a0 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29   "ON" : "USING")
209b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f  .    );.    goto
209c0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
209d0 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  or;.  }.  p = sq
209e0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
209f0 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65  nd(db, p, pTable
20a00 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
20a10 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
20a20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
20a30 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73  _error;.  }.  as
20a40 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
20a50 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d  );.  pItem = &p-
20a60 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
20a70 20 61 73 73 65 72 74 28 20 28 70 54 61 62 6c 65   assert( (pTable
20a80 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65  ==0)==(pDatabase
20a90 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
20aa0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
20ab0 30 20 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d  0 || pDatabase!=
20ac0 30 20 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  0 );.  if( IN_RE
20ad0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
20ae0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
20af0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e     Token *pToken
20b00 20 3d 20 28 41 4c 57 41 59 53 28 70 44 61 74 61   = (ALWAYS(pData
20b10 62 61 73 65 29 20 26 26 20 70 44 61 74 61 62 61  base) && pDataba
20b20 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61  se->z) ? pDataba
20b30 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20  se : pTable;.   
20b40 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
20b50 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70  kenMap(pParse, p
20b60 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f  Item->zName, pTo
20b70 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ken);.  }.  asse
20b80 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b  rt( pAlias!=0 );
20b90 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e  .  if( pAlias->n
20ba0 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
20bb0 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
20bc0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
20bd0 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
20be0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
20bf0 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
20c00 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
20c10 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
20c20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
20c30 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66  rn p;.. append_f
20c40 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73  rom_error:.  ass
20c50 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73  ert( p==0 );.  s
20c60 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
20c70 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c  (db, pOn);.  sql
20c80 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
20c90 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20  (db, pUsing);.  
20ca0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
20cb0 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
20cc0 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  y);.  return 0;.
20cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
20ce0 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
20cf0 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
20d00 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
20d10 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20  ently added .** 
20d20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73  element of the s
20d30 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65  ource-list passe
20d40 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
20d50 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
20d60 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
20d70 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20  IndexedBy(Parse 
20d80 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
20d90 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64   *p, Token *pInd
20da0 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72  exedBy){.  asser
20db0 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30  t( pIndexedBy!=0
20dc0 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
20dd0 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29  IndexedBy->n>0 )
20de0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
20df0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
20e10 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70  >nSrc>0 );.    p
20e20 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
20e30 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
20e40 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
20e50 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
20e60 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20e70 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
20e80 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
20e90 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
20ea0 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
20eb0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
20ec0 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
20ed0 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
20ee0 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
20ef0 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
20f00 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
20f10 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
20f20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
20f30 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
20f40 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
20f50 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
20f60 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
20f70 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
20f80 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
20f90 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
20fa0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
20fb0 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
20fc0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
20fd0 49 6e 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20  IndexedBy = 1;. 
20fe0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
20ff0 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
21000 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
21010 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
21020 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
21030 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
21040 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
21050 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
21060 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
21070 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
21080 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
21090 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
210a0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
210b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
210c0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
210d0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
210e0 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
210f0 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
21100 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21110 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
21120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21130 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
21140 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
21150 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
21160 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
21170 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
21180 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
21190 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
211a0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
211b0 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
211c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
211d0 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
211e0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
211f0 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
21200 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
21210 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
21220 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
21230 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
21240 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
21250 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
21260 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
21270 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
21280 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
21290 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
212a0 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
212b0 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
212c0 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
212d0 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
212e0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
212f0 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
21300 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
21310 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
21320 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
21330 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
21340 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
21350 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
21360 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
21370 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
21380 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
21390 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
213a0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
213b0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
213c0 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
213d0 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
213e0 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
213f0 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
21400 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
21410 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
21420 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
21430 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
21440 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
21450 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
21460 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
21470 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
21480 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
21490 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
214a0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
214b0 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
214c0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
214d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
214e0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
214f0 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74  for a BEGIN stat
21500 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
21510 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
21520 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
21530 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
21540 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21550 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
21560 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
21570 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
21580 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21590 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
215a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
215b0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
215c0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
215d0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
215e0 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
215f0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
21600 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
21610 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
21620 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
21630 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
21640 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
21650 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
21660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
21680 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
21690 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
216a0 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
216b0 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
216c0 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
216d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
216e0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75  eAddOp0(v, OP_Au
216f0 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a  toCommit);.}../*
21700 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
21710 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d  E code for a COM
21720 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
21730 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f  statement..** Co
21740 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  de for ROLLBACK 
21750 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 66 20  is generated if 
21760 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41  eType==TK_ROLLBA
21770 43 4b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  CK.  Otherwise.*
21780 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  * code is genera
21790 74 65 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ted for a COMMIT
217a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
217b0 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
217c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
217d0 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62  nt eType){.  Vdb
217e0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f  e *v;.  int isRo
217f0 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72  llback;..  asser
21800 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
21810 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
21820 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
21830 65 72 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43  ert( eType==TK_C
21840 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d  OMMIT || eType==
21850 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d  TK_END || eType=
21860 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  =TK_ROLLBACK );.
21870 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65    isRollback = e
21880 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
21890 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  K;.  if( sqlite3
218a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
218b0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
218c0 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73  TION, .       is
218d0 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c  Rollback ? "ROLL
218e0 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22  BACK" : "COMMIT"
218f0 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
21900 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
21910 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
21920 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
21930 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
21940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21950 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69  AutoCommit, 1, i
21960 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a  sRollback);.  }.
21970 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
21980 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21990 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
219a0 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
219b0 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
219c0 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
219d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
219e0 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
219f0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
21a00 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
21a10 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
21a20 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
21a30 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
21a40 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
21a50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
21a60 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
21a70 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
21a80 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
21a90 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
21aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21ab0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
21ac0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
21ad0 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
21ae0 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
21af0 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
21b00 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
21b10 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
21b20 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
21b30 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
21b40 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
21b50 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
21b60 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
21b70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
21b80 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
21b90 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
21ba0 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
21bb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
21bc0 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
21bd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
21be0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21bf0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
21c00 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
21c10 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
21c20 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
21c30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
21c40 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
21c50 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
21c60 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
21c70 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
21c80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
21c90 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
21ca0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
21cb0 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
21cc0 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
21cd0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
21ce0 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
21cf0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
21d00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
21d10 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
21d20 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
21d30 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
21d40 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
21d50 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
21d60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
21d70 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
21d80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
21d90 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
21da0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
21db0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
21dc0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
21dd0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
21de0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
21df0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
21e00 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
21e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
21e20 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
21e30 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
21e40 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
21e50 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
21e60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21e90 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
21ea0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
21eb0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
21ec0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
21ed0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
21ee0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
21ef0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
21f00 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
21f10 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
21f20 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
21f30 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21f40 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
21f50 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
21f60 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
21f70 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
21f80 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
21f90 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
21fa0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
21fb0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
21fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21fe0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
21ff0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
22000 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
22010 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
22020 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
22030 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
22040 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
22050 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
22060 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
22070 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
22080 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
22090 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
220a0 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
220b0 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
220c0 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
220d0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
220e0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
220f0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
22100 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
22110 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
22120 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
22130 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
22140 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72  Parse);..  asser
22150 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
22160 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
22170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
22180 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
22190 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
221a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
221b0 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
221c0 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
221d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
221e0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70  chemaMutexHeld(p
221f0 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20  Parse->db, iDb, 
22200 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
22210 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
22220 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
22230 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
22240 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
22250 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
22260 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  b);.    if( !OMI
22270 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
22280 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
22290 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
222a0 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
222b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
222c0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
222d0 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
222e0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
222f0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
22300 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
22310 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
22320 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
22330 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
22340 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
22350 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
22360 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
22370 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
22380 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
22390 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
223a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
223b0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
223c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
223d0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
223e0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
223f0 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
22400 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
22410 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
22420 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
22430 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20  >zDbSName)) ){. 
22440 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
22450 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
22460 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
22470 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
22480 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
22490 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
224a0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
224b0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
224c0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
224d0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
224e0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
224f0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
22500 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
22510 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
22520 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
22530 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
22540 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
22550 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
22560 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
22570 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
22580 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
22590 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
225a0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
225b0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
225c0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
225d0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
225e0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
225f0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
22600 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
22610 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
22620 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
22630 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
22640 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
22650 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
22660 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
22670 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
22680 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
22690 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
226a0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
226b0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
226c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
226d0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
226e0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
226f0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
22700 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
22710 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
22720 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
22730 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
22740 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22750 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
22760 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
22770 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
22780 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
22790 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
227a0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
227b0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
227c0 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
227d0 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
227e0 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
227f0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
22800 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
22810 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
22820 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
22830 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
22840 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
22850 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
22860 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
22870 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
22880 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
22890 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
228a0 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
228b0 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
228c0 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
228d0 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
228e0 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
228f0 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
22900 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
22910 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
22920 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
22930 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
22940 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
22950 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
22960 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
22970 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
22980 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
22990 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
229a0 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
229b0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
229c0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
229d0 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
229e0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
229f0 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
22a00 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
22a10 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
22a20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
22a30 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
22a40 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
22a50 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
22a60 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
22a70 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
22a80 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
22a90 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
22aa0 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
22ab0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
22ac0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
22ad0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
22ae0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
22af0 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
22b00 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
22b10 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
22b20 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
22b30 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
22b40 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
22b50 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
22b60 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
22b70 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
22b80 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
22b90 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
22ba0 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
22bb0 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
22bc0 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
22bd0 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
22be0 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
22bf0 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
22c00 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
22c10 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
22c20 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
22c30 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
22c40 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
22c50 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
22c60 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
22c70 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
22c80 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
22c90 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
22ca0 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
22cb0 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
22cc0 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
22cd0 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
22ce0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
22cf0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
22d00 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
22d10 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
22d20 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
22d30 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
22d40 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
22d50 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
22d60 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
22d70 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
22d80 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
22d90 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
22da0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
22db0 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
22dc0 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
22dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
22de0 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
22df0 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
22e00 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
22e10 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
22e20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
22e30 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
22e40 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
22e50 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
22e60 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
22e70 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
22e80 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
22e90 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
22ea0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
22eb0 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
22ec0 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22ed0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22ee0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
22ef0 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
22f00 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
22f10 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
22f20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
22f30 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
22f40 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
22f50 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
22f60 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
22f70 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
22f80 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
22f90 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
22fa0 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
22fb0 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
22fc0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
22fd0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
22fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
22ff0 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
23000 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
23010 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
23020 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
23030 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
23040 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
23050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23060 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
23070 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
23080 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
23090 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
230a0 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
230b0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
230c0 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
230d0 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
230e0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
230f0 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
23100 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
23110 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
23120 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23130 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23140 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
23150 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
23160 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
23170 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
23180 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
23190 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
231a0 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
231b0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
231c0 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
231d0 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
231e0 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
231f0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
23200 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
23210 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
23220 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
23230 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70  0, 200);.  if( p
23240 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b  Idx->aColExpr ){
23250 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72  .    sqlite3_str
23260 5f 61 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67  _appendf(&errMsg
23270 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20  , "index '%q'", 
23280 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
23290 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a  }else{.    for(j
232a0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
232b0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
232c0 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
232d0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
232e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
232f0 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  );.      zCol = 
23300 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
23310 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
23320 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ame;.      if( j
23330 20 29 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61   ) sqlite3_str_a
23340 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
23350 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  , ", 2);.      s
23360 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
23370 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54  dall(&errMsg, pT
23380 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
23390 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
233a0 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e  pend(&errMsg, ".
233b0 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 1);.      sql
233c0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
233d0 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c  ll(&errMsg, zCol
233e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  );.    }.  }.  z
233f0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Err = sqlite3Str
23400 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72  AccumFinish(&err
23410 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48  Msg);.  sqlite3H
23420 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
23430 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69  arse, .    IsPri
23440 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
23450 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  x) ? SQLITE_CONS
23460 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
23470 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
23490 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
234a0 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f  NT_UNIQUE,.    o
234b0 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34  nError, zErr, P4
234c0 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e  _DYNAMIC, P5_Con
234d0 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
234e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  }.../*.** Code a
234f0 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
23500 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
23510 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
23520 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e  e3RowidConstrain
23530 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23540 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
23550 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
23560 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
23570 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
23580 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
23590 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  m */.  Table *pT
235a0 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ab       /* The 
235b0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e  table with the n
235c0 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20  on-unique rowid 
235d0 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  */ .){.  char *z
235e0 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
235f0 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
23600 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20  >=0 ){.    zMsg 
23610 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
23620 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
23630 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
23640 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
23660 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
23670 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
23680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
23690 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
236a0 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EY;.  }else{.   
236b0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
236c0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
236d0 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70  b, "%s.rowid", p
236e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
236f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
23700 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20  STRAINT_ROWID;. 
23710 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74   }.  sqlite3Halt
23720 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
23730 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20  e, rc, onError, 
23740 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
23750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23760 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e            P5_Con
23770 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
23780 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
23790 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
237a0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
237b0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
237c0 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
237d0 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
237e0 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
237f0 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
23800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
23810 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
23820 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
23830 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
23840 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
23850 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  x){.  int i;.  a
23860 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
23870 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23880 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
23890 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
238a0 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65   char *z = pInde
238b0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
238c0 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c    assert( z!=0 |
238d0 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  | pIndex->aiColu
238e0 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69  mn[i]<0 );.    i
238f0 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  f( pIndex->aiCol
23900 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d  umn[i]>=0 && 0==
23910 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
23920 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
23930 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
23940 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
23950 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
23960 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
23970 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
23980 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
23990 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
239a0 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
239b0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
239c0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
239d0 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
239e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
239f0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
23a00 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
23a10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23a20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
23a30 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
23a40 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
23a50 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
23a60 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
23a70 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
23a80 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
23a90 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
23aa0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
23ab0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
23ac0 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
23ad0 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
23ae0 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
23af0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
23b00 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
23b10 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
23b20 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
23b30 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
23b40 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
23b50 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
23b60 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
23b70 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
23b80 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
23b90 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
23ba0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
23bb0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
23bc0 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
23bd0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
23be0 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
23bf0 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
23c00 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23c10 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
23c20 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
23c30 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
23c40 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
23c50 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
23c60 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
23c70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
23c80 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
23c90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
23ca0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
23cb0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23cd0 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
23ce0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
23cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23d00 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23d10 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
23d20 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
23d30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23d40 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23d50 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
23d60 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d80 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
23d90 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
23da0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
23db0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23dc0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
23dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
23de0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23df0 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
23e00 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
23e10 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
23e20 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
23e30 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
23e40 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
23e50 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
23e60 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
23e70 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
23e80 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
23e90 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
23ea0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
23eb0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
23ec0 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
23ed0 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
23ee0 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
23ef0 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
23f00 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
23f10 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
23f20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
23f30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
23f40 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
23f50 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
23f60 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
23f90 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
23fa0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
23fb0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
23fc0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
23fd0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
23fe0 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
23ff0 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
24000 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
24010 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
24020 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
24030 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
24040 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
24050 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
24060 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
24070 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
24080 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
24090 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
240a0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
240b0 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
240c0 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
240d0 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
240e0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
240f0 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
24100 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
24110 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
24120 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
24130 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
24140 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
24150 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
24160 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
24170 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
24180 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
24190 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
241a0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
241b0 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
241c0 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
241d0 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
24200 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
24210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
24220 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24230 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
24240 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
24250 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
24260 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
24270 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24280 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
24290 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
242a0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
242b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
242c0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242e0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
242f0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
24300 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24310 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
24320 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
24330 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
24340 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
24350 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
24360 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
24370 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
24380 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
24390 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
243a0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
243b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
243c0 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
243d0 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
243e0 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
243f0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
24400 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
24410 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
24420 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
24430 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
24440 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
24450 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
24460 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
24470 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
24480 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
24490 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
244a0 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
244b0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
244c0 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
244d0 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
244e0 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
244f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
24500 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
24510 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
24520 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
24530 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
24540 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
24550 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
24560 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
24570 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
24580 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
24590 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
245a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
245b0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
245c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
245d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
245e0 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
245f0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
24600 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
24610 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
24620 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
24630 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
24640 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
24650 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
24660 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
24670 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
24680 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
24690 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
246a0 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
246b0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
246c0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
246d0 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
246e0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
246f0 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
24700 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24710 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
24720 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
24730 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
24740 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
24750 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
24760 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
24770 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
24780 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
24790 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
247a0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
247b0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
247c0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
247d0 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
247e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
247f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24800 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
24810 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
24820 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
24830 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24840 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66   Return a KeyInf
24850 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
24860 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
24870 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e  for the given In
24880 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  dex..**.** The c
24890 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
248a0 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
248b0 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
248c0 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
248d0 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
248e0 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
248f0 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
24900 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
24910 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
24920 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
24930 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
24940 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
24950 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65  olumn;.  int nKe
24960 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  y = pIdx->nKeyCo
24970 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  l;.  KeyInfo *pK
24980 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  ey;.  if( pParse
24990 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
249a0 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75  0;.  if( pIdx->u
249b0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
249c0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
249d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
249e0 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
249f0 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  Col-nKey);.  }el
24a00 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  se{.    pKey = s
24a10 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
24a20 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
24a30 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  Col, 0);.  }.  i
24a40 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
24a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
24a60 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
24a70 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f  (pKey) );.    fo
24a80 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
24a90 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
24aa0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
24ab0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
24ac0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
24ad0 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71  l[i] = zColl==sq
24ae0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f  lite3StrBINARY ?
24af0 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20   0 :.           
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24b10 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
24b20 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
24b30 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
24b40 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
24b50 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
24b60 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
24b70 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
24b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24b90 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54  Parse->rc==SQLIT
24ba0 45 5f 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f  E_ERROR_MISSING_
24bb0 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20  COLLSEQ );.     
24bc0 20 69 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75   if( pIdx->bNoQu
24bd0 65 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ery==0 ){.      
24be0 20 20 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20    /* Deactivate 
24bf0 74 68 65 20 69 6e 64 65 78 20 62 65 63 61 75 73  the index becaus
24c00 65 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  e it contains an
24c10 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69   unknown collati
24c20 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ng.        ** se
24c30 71 75 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c  quence.  The onl
24c40 79 20 77 61 79 20 74 6f 20 72 65 61 63 74 69 76  y way to reactiv
24c50 65 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  e the index is t
24c60 6f 20 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20  o reload the.   
24c70 20 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20       ** schema. 
24c80 20 41 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73   Adding the miss
24c90 69 6e 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ing collating se
24ca0 71 75 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65  quence later doe
24cb0 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
24cc0 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e   reactive the in
24cd0 64 65 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63  dex.  The applic
24ce0 61 74 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68  ation had the ch
24cf0 61 6e 63 65 20 74 6f 20 72 65 67 69 73 74 65 72  ance to register
24d00 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
24d10 6d 69 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73  missing index us
24d20 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
24d30 6e 2d 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63  n-needed callbac
24d40 6b 2e 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20  k.  For.        
24d50 2a 2a 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53  ** simplicity, S
24d60 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67  QLite will not g
24d70 69 76 65 20 74 68 65 20 61 70 70 6c 69 63 61 74  ive the applicat
24d80 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61  ion a second cha
24d90 6e 63 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nce..        */.
24da0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e          pIdx->bN
24db0 6f 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20  oQuery = 1;.    
24dc0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
24dd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45   SQLITE_ERROR_RE
24de0 54 52 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TRY;.      }.   
24df0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
24e00 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20  oUnref(pKey);.  
24e10 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20      pKey = 0;.  
24e20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24e30 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pKey;.}..#ifnde
24e40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
24e50 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  E./* .** This ro
24e60 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
24e70 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79   once per CTE by
24e80 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
24e90 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20  e parsing a .** 
24ea0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f  WITH clause. .*/
24eb0 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69  .With *sqlite3Wi
24ec0 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a  thAdd(.  Parse *
24ed0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24ee0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24ef0 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ext */.  With *p
24f00 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
24f10 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54   /* Existing WIT
24f20 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  H clause, or NUL
24f30 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
24f40 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
24f50 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
24f60 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20  mmon-table */.  
24f70 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69  ExprList *pArgli
24f80 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f  st,     /* Optio
24f90 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  nal column name 
24fa0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62  list for the tab
24fb0 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
24fc0 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20  pQuery          
24fd0 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f  /* Query used to
24fe0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
24ff0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  table */.){.  sq
25000 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
25010 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a  se->db;.  With *
25020 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pNew;.  char *zN
25030 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ame;..  /* Check
25040 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61   that the CTE na
25050 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74  me is unique wit
25060 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c  hin this WITH cl
25070 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f  ause. If.  ** no
25080 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f  t, store an erro
25090 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
250a0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a  tructure. */.  z
250b0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
250c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
250d0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
250e0 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70    if( zName && p
250f0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
25100 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
25110 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
25120 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
25130 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
25140 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d  ame, pWith->a[i]
25150 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
25160 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25170 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
25180 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61  uplicate WITH ta
25190 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  ble name: %s", z
251a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
251b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
251c0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
251d0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
251e0 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f  *pWith) + (sizeo
251f0 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a  f(pWith->a[1]) *
25200 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20   pWith->nCte);. 
25210 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
25220 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
25230 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20  With, nByte);.  
25240 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20  }else{.    pNew 
25250 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
25260 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
25270 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20  (*pWith));.  }. 
25280 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d   assert( (pNew!=
25290 30 20 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c  0 && zName!=0) |
252a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
252b0 65 64 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ed );..  if( db-
252c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
252d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
252e0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
252f0 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  Arglist);.    sq
25300 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
25310 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20  e(db, pQuery);. 
25320 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25330 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
25340 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20   pNew = pWith;. 
25350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
25360 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
25370 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79  pSelect = pQuery
25380 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
25390 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20  ew->nCte].pCols 
253a0 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20  = pArglist;.    
253b0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
253c0 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  te].zName = zNam
253d0 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e;.    pNew->a[p
253e0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45  New->nCte].zCteE
253f0 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rr = 0;.    pNew
25400 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nCte++;.  }.. 
25410 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
25420 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
25430 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
25440 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73  With object pass
25450 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
25460 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
25470 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  id sqlite3WithDe
25480 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
25490 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a  , With *pWith){.
254a0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
254b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
254c0 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
254d0 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
254e0 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
254f0 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69  te = &pWith->a[i
25500 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
25510 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
25520 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b  b, pCte->pCols);
25530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
25540 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
25550 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Cte->pSelect);. 
25560 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
25570 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  ee(db, pCte->zNa
25580 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
25590 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
255a0 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23   pWith);.  }.}.#
255b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
255c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  d(SQLITE_OMIT_CT
255d0 45 29 20 2a 2f 0a                                E) */.