/ Hex Artifact Content
Login

Artifact 83ab73704ba4040b58a68079d2e7190e33ac07b0c6cb0ad829816312055bbf39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
2120: 61 6e 20 72 65 73 75 6c 74 20 65 69 74 68 65 72  an result either
2130: 20 66 72 6f 6d 20 61 6e 20 4f 4f 4d 20 6f 72 20   from an OOM or 
2140: 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 72 6d  because the form
2150: 61 74 74 65 64 20 73 74 72 69 6e 67 0a 20 20 20  atted string.   
2160: 20 2a 2a 20 65 78 63 65 65 64 73 20 53 51 4c 49   ** exceeds SQLI
2170: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 2e  TE_LIMIT_LENGTH.
2180: 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20    In the latter 
2190: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
21a0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 6e 20 65   set.    ** an e
21b0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
21c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21d0: 64 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  d ) pParse->rc =
21e0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
21f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2200: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2210: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
2220: 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c  eBuf, PARSE_TAIL
2230: 28 70 50 61 72 73 65 29 2c 20 50 41 52 53 45 5f  (pParse), PARSE_
2240: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  TAIL_SZ);.  mems
2250: 65 74 28 50 41 52 53 45 5f 54 41 49 4c 28 70 50  et(PARSE_TAIL(pP
2260: 61 72 73 65 29 2c 20 30 2c 20 50 41 52 53 45 5f  arse), 0, PARSE_
2270: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  TAIL_SZ);.  sqli
2280: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
2290: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
22a0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
22b0: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
22c0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
22d0: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
22e0: 20 6d 65 6d 63 70 79 28 50 41 52 53 45 5f 54 41   memcpy(PARSE_TA
22f0: 49 4c 28 70 50 61 72 73 65 29 2c 20 73 61 76 65  IL(pParse), save
2300: 42 75 66 2c 20 50 41 52 53 45 5f 54 41 49 4c 5f  Buf, PARSE_TAIL_
2310: 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  SZ);.  pParse->n
2320: 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20  ested--;.}..#if 
2330: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2340: 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ENTICATION./*.**
2350: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2360: 7a 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61  zTable is the na
2370: 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  me of the system
2380: 20 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72   table that stor
2390: 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f  es the.** list o
23a0: 66 20 75 73 65 72 73 20 61 6e 64 20 74 68 65 69  f users and thei
23b0: 72 20 61 63 63 65 73 73 20 63 72 65 64 65 6e 74  r access credent
23c0: 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ials..*/.int sql
23d0: 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
23e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
23f0: 61 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  able){.  return 
2400: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2410: 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
2420: 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e  user")==0;.}.#en
2430: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2440: 54 45 5f 45 4e 41 42 4c 45 5f 53 48 41 52 45 44  TE_ENABLE_SHARED
2450: 5f 53 43 48 45 4d 41 0a 2f 2a 0a 2a 2a 20 49 66  _SCHEMA./*.** If
2460: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
2470: 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 6f 70  onnection was op
2480: 65 6e 65 64 20 77 69 74 68 20 74 68 65 20 53 51  ened with the SQ
2490: 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
24a0: 5f 53 43 48 45 4d 41 0a 2a 2a 20 66 6c 61 67 20  _SCHEMA.** flag 
24b0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
24c0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
24d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
24e0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
24f0: 0a 2a 2a 20 69 73 20 6c 6f 61 64 65 64 2e 20 45  .** is loaded. E
2500: 69 74 68 65 72 20 62 79 20 6f 62 74 61 69 6e 69  ither by obtaini
2510: 6e 67 20 61 20 53 63 68 65 6d 61 20 6f 62 6a 65  ng a Schema obje
2520: 63 74 20 66 72 6f 6d 20 74 68 65 20 73 63 68 65  ct from the sche
2530: 6d 61 2d 70 6f 6f 6c 2c 20 6f 72 0a 2a 2a 20 62  ma-pool, or.** b
2540: 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  y reading the co
2550: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  ntents of the sq
2560: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2570: 65 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  e. Unless it is 
2580: 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 6c 6f  NULL, .** the lo
2590: 63 61 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 64  cation indicated
25a0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 70 62   by parameter pb
25b0: 55 6e 6c 6f 61 64 20 69 73 20 73 65 74 20 74 6f  Unload is set to
25c0: 20 31 20 69 66 20 61 20 73 68 61 72 65 64 2d 73   1 if a shared-s
25d0: 63 68 65 6d 61 20 0a 2a 2a 20 69 73 20 6c 6f 61  chema .** is loa
25e0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
25f0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
2600: 65 20 77 61 73 20 6e 6f 74 20 6f 70 65 6e 65 64  e was not opened
2610: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
2620: 4e 5f 53 48 41 52 45 44 5f 53 43 48 45 4d 41 2c  N_SHARED_SCHEMA,
2630: 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73 63   or.** if the sc
2640: 68 65 6d 61 20 66 6f 72 20 64 61 74 61 62 61 73  hema for databas
2650: 65 20 69 44 62 20 69 73 20 61 6c 72 65 61 64 79  e iDb is already
2660: 20 6c 6f 61 64 65 64 2c 20 74 68 69 73 20 66 75   loaded, this fu
2670: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2680: 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
2690: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
26a0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
26b0: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26c0: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
26d0: 20 49 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   If.** an error 
26e0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26f0: 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
2700: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
2710: 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f  o a buffer.** co
2720: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 65 72 72 6f  ntaining an erro
2730: 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  r message. It is
2740: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2750: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2760: 72 20 74 6f 0a 2a 2a 20 65 76 65 6e 74 75 61 6c  r to.** eventual
2770: 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66  ly free this buf
2780: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
2790: 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74  3_free()..*/.int
27a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4c 6f   sqlite3SchemaLo
27b0: 61 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ad(sqlite3 *db, 
27c0: 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 2a 70 62  int iDb, int *pb
27d0: 55 6e 6c 6f 61 64 2c 20 63 68 61 72 20 2a 2a 70  Unload, char **p
27e0: 7a 45 72 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  zErr){.  int rc 
27f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2800: 66 28 20 49 73 53 68 61 72 65 64 53 63 68 65 6d  f( IsSharedSchem
2810: 61 28 64 62 29 20 0a 20 20 20 20 20 20 26 26 20  a(db) .      && 
2820: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
2830: 2c 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61  , iDb, DB_Schema
2840: 4c 6f 61 64 65 64 29 3d 3d 30 20 0a 20 20 20 20  Loaded)==0 .    
2850: 20 20 26 26 20 28 64 62 2d 3e 69 6e 69 74 2e 62    && (db->init.b
2860: 75 73 79 3d 3d 30 20 7c 7c 20 28 69 44 62 21 3d  usy==0 || (iDb!=
2870: 31 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 69 44  1 && db->init.iD
2880: 62 3d 3d 31 29 29 0a 20 20 29 7b 0a 20 20 20 20  b==1)).  ){.    
2890: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 49 6e  struct sqlite3In
28a0: 69 74 49 6e 66 6f 20 73 76 20 3d 20 64 62 2d 3e  itInfo sv = db->
28b0: 69 6e 69 74 3b 0a 20 20 20 20 6d 65 6d 73 65 74  init;.    memset
28c0: 28 26 64 62 2d 3e 69 6e 69 74 2c 20 30 2c 20 73  (&db->init, 0, s
28d0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 71 6c  izeof(struct sql
28e0: 69 74 65 33 49 6e 69 74 49 6e 66 6f 29 29 3b 0a  ite3InitInfo));.
28f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2900: 49 6e 69 74 4f 6e 65 28 64 62 2c 20 69 44 62 2c  InitOne(db, iDb,
2910: 20 70 7a 45 72 72 2c 20 30 29 3b 0a 20 20 20 20   pzErr, 0);.    
2920: 64 62 2d 3e 69 6e 69 74 20 3d 20 73 76 3b 0a 20  db->init = sv;. 
2930: 20 20 20 69 66 28 20 70 62 55 6e 6c 6f 61 64 20     if( pbUnload 
2940: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2950: 20 26 26 20 69 44 62 21 3d 31 20 29 20 2a 70 62   && iDb!=1 ) *pb
2960: 55 6e 6c 6f 61 64 20 3d 20 31 3b 0a 20 20 7d 0a  Unload = 1;.  }.
2970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2980: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  endif../*.** Loc
2990: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
29a0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
29b0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
29c0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
29d0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
29e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
29f0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2a00: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2a10: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2a20: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2a30: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2a40: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2a50: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2a60: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2a70: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
2a80: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
2a90: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
2aa0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
2ab0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
2ac0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
2ad0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
2ae0: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
2af0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2b00: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
2b10: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2b20: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
2b30: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2b40: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
2b50: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2b60: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
2b70: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
2b80: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
2b90: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
2ba0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
2bb0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
2bc0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
2bd0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
2be0: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
2bf0: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20  nt i;..  /* All 
2c00: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
2c10: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
2c20: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
2c30: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
2c40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
2c50: 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71  atabase!=0 || sq
2c60: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2c70: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2c80: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2c90: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2ca0: 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61 64    /* Only the ad
2cb0: 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c 6f  min user is allo
2cc0: 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61 74  wed to know that
2cd0: 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65 72   the sqlite_user
2ce0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69 73   table.  ** exis
2cf0: 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ts */.  if( db->
2d00: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
2d10: 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73 71  AUTH_Admin && sq
2d20: 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
2d30: 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  le(zName)!=0 ){.
2d40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2d50: 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65  }.#endif.  while
2d60: 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 4f  (1){.    for(i=O
2d70: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2d80: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2d90: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2da0: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
2db0: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2dc0: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2dd0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 3d    if( zDatabase=
2de0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
2df0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
2e00: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e  db->aDb[j].zDbSN
2e10: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
2e20: 20 20 20 69 6e 74 20 62 55 6e 6c 6f 61 64 20 3d     int bUnload =
2e30: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   0;.        asse
2e40: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2e50: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2e60: 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20  , 0) );.        
2e70: 69 66 28 20 49 73 53 68 61 72 65 64 53 63 68 65  if( IsSharedSche
2e80: 6d 61 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20  ma(db) ){.      
2e90: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
2ea0: 65 20 3d 20 64 62 2d 3e 70 50 61 72 73 65 3b 0a  e = db->pParse;.
2eb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2ec0: 61 72 73 65 20 26 26 20 70 50 61 72 73 65 2d 3e  arse && pParse->
2ed0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nErr==0 ){.     
2ee0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
2ef0: 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  c = sqlite3Schem
2f00: 61 4c 6f 61 64 28 64 62 2c 20 6a 2c 20 26 62 55  aLoad(db, j, &bU
2f10: 6e 6c 6f 61 64 2c 20 26 70 50 61 72 73 65 2d 3e  nload, &pParse->
2f20: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2f30: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
2f40: 2d 3e 72 63 20 29 20 70 50 61 72 73 65 2d 3e 6e  ->rc ) pParse->n
2f50: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
2f60: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2f70: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
2f80: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
2f90: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
2fa0: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  lHash, zName);. 
2fb0: 20 20 20 20 20 20 20 69 66 28 20 70 20 29 20 72         if( p ) r
2fc0: 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 20  eturn p;.       
2fd0: 20 69 66 28 20 62 55 6e 6c 6f 61 64 20 29 7b 0a   if( bUnload ){.
2fe0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ff0: 33 53 63 68 65 6d 61 52 65 6c 65 61 73 65 28 64  3SchemaRelease(d
3000: 62 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, j);.        }
3010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3020: 20 20 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e     /* Not found.
3030: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 77 65    If the name we
3040: 20 77 65 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   were looking fo
3050: 72 20 77 61 73 20 74 65 6d 70 2e 73 71 6c 69 74  r was temp.sqlit
3060: 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20  e_master.    ** 
3070: 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
3080: 6e 61 6d 65 20 74 6f 20 73 71 6c 69 74 65 5f 74  name to sqlite_t
3090: 65 6d 70 5f 6d 61 73 74 65 72 20 61 6e 64 20 74  emp_master and t
30a0: 72 79 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ry again. */.   
30b0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
30c0: 43 6d 70 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45  Cmp(zName, MASTE
30d0: 52 5f 4e 41 4d 45 29 21 3d 30 20 29 20 62 72 65  R_NAME)!=0 ) bre
30e0: 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
30f0: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 61 74  te3_stricmp(zDat
3100: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31  abase, db->aDb[1
3110: 5d 2e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29  ].zDbSName)!=0 )
3120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d   break;.    zNam
3130: 65 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f  e = TEMP_MASTER_
3140: 4e 41 4d 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NAME;.  }.  retu
3150: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 0;.}../*.** L
3160: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
3170: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
3180: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
3190: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
31a0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
31b0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
31c0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
31d0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
31e0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
31f0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
3200: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
3210: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
3220: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
3230: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
3240: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
3250: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
3260: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
3270: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
3280: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
3290: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
32a0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
32b0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
32c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
32d0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
32e0: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
32f0: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
3300: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
3310: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
3320: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3330: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63  se,         /* c
3340: 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20  ontext in which 
3350: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
3360: 20 2a 2f 0a 20 20 75 33 32 20 66 6c 61 67 73 2c   */.  u32 flags,
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3380: 4c 4f 43 41 54 45 5f 56 49 45 57 20 6f 72 20 4c  LOCATE_VIEW or L
3390: 4f 43 41 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20  OCATE_NOERR */. 
33a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
33b0: 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
33c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
33d0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
33e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
33f0: 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e  *zDbase     /* N
3400: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
3410: 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ase.  Might be N
3420: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ULL */.){.  Tabl
3430: 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *p;.  sqlite3 
3440: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
3450: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
3460: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
3470: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
3480: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
3490: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
34a0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
34b0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
34c0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28  NULL. */.  if( (
34d0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44  db->mDbFlags & D
34e0: 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77  BFLAG_SchemaKnow
34f0: 6e 4f 6b 29 3d 3d 30 20 0a 20 20 20 26 26 20 21  nOk)==0 .   && !
3500: 49 73 53 68 61 72 65 64 53 63 68 65 6d 61 28 64  IsSharedSchema(d
3510: 62 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  b).   && SQLITE_
3520: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
3530: 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20 20  chema(pParse).  
3540: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3550: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
3560: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
3570: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
3580: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 23  .  if( p==0 ){.#
3590: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
35b0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
35c0: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
35d0: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
35e0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
35f0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  ated using.    *
3600: 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63  * CREATE, then c
3610: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
3620: 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
3630: 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c   an virtual tabl
3640: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61  e that.    ** ca
3650: 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f 75  n be an eponymou
3660: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  s virtual table.
3670: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
3680: 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61 62 3d  se->disableVtab=
3690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f 64 75  =0 ){.      Modu
36a0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
36b0: 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  le*)sqlite3HashF
36c0: 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ind(&db->aModule
36d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
36e0: 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73  if( pMod==0 && s
36f0: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
3700: 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22  zName, "pragma_"
3710: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 7)==0 ){.     
3720: 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65     pMod = sqlite
3730: 33 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73  3PragmaVtabRegis
3740: 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ter(db, zName);.
3750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3760: 28 20 70 4d 6f 64 20 29 7b 0a 20 20 20 20 20 20  ( pMod ){.      
3770: 20 20 69 66 28 20 49 73 53 68 61 72 65 64 53 63    if( IsSharedSc
3780: 68 65 6d 61 28 64 62 29 20 26 26 20 70 50 61 72  hema(db) && pPar
3790: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
37a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75           int bDu
37b0: 6d 6d 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mmy = 0;.       
37c0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
37d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4c 6f 61  sqlite3SchemaLoa
37e0: 64 28 64 62 2c 20 30 2c 20 26 62 44 75 6d 6d 79  d(db, 0, &bDummy
37f0: 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  , &pParse->zErrM
3800: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  sg);.          i
3810: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 20 29 20  f( pParse->rc ) 
3820: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3840: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
3850: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
3860: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
3870: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ) ){.          T
3880: 61 62 6c 65 20 2a 70 45 70 6f 54 61 62 20 3d 20  able *pEpoTab = 
3890: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20  pMod->pEpoTab;. 
38a0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
38b0: 20 49 73 53 68 61 72 65 64 53 63 68 65 6d 61 28   IsSharedSchema(
38c0: 64 62 29 20 7c 7c 20 70 45 70 6f 54 61 62 2d 3e  db) || pEpoTab->
38d0: 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
38e0: 5b 30 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [0].pSchema );. 
38f0: 20 20 20 20 20 20 20 20 20 70 45 70 6f 54 61 62           pEpoTab
3900: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
3910: 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 3b 20  aDb[0].pSchema; 
3920: 20 2f 2a 20 46 6f 72 20 53 48 41 52 45 44 5f 53   /* For SHARED_S
3930: 43 48 45 4d 41 20 6d 6f 64 65 20 2a 2f 0a 20 20  CHEMA mode */.  
3940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3950: 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 20 20  EpoTab;.        
3960: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3970: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
3980: 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f 4e 4f  lags & LOCATE_NO
3990: 45 52 52 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ERR ) return 0;.
39a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
39b0: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
39c0: 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
39d0: 61 6c 28 70 29 20 26 26 20 70 50 61 72 73 65 2d  al(p) && pParse-
39e0: 3e 64 69 73 61 62 6c 65 56 74 61 62 20 29 7b 0a  >disableVtab ){.
39f0: 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a 0a      p = 0;.  }..
3a00: 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 28 21    if( p==0 && (!
3a10: 49 73 53 68 61 72 65 64 53 63 68 65 6d 61 28 64  IsSharedSchema(d
3a20: 62 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  b) || pParse->nE
3a30: 72 72 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63 6f  rr==0) ){.    co
3a40: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  nst char *zMsg =
3a50: 20 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f   flags & LOCATE_
3a60: 56 49 45 57 20 3f 20 22 6e 6f 20 73 75 63 68 20  VIEW ? "no such 
3a70: 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68  view" : "no such
3a80: 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28   table";.    if(
3a90: 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20   zDbase ){.     
3aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ab0: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
3ac0: 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61  .%s", zMsg, zDba
3ad0: 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  se, zName);.    
3ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
3af0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3b00: 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a  rse, "%s: %s", z
3b10: 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Msg, zName);.   
3b20: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3b30: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
3b40: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 64  ate the table id
3b50: 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e 0a  entified by *p..
3b60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
3b70: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
3b80: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
3b90: 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72 65  e(). The differe
3ba0: 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 73  nce between.** s
3bb0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
3bc0: 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75 6e  e() and this fun
3bd0: 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74 68  ction is that th
3be0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 74  is function rest
3bf0: 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65 61  ricts.** the sea
3c00: 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28 70  rch to schema (p
3c10: 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69 74  ->pSchema) if it
3c20: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d   is not NULL. p-
3c30: 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65 0a  >pSchema may be.
3c40: 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69  ** non-NULL if i
3c50: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 76  t is part of a v
3c60: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 70  iew or trigger p
3c70: 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69 6f  rogram definitio
3c80: 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74 65  n. See.** sqlite
3c90: 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66 6f  3FixSrcList() fo
3ca0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61  r details..*/.Ta
3cb0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
3cc0: 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20 50  teTableItem(.  P
3cd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
3ce0: 20 75 33 32 20 66 6c 61 67 73 2c 0a 20 20 73 74   u32 flags,.  st
3cf0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
3d00: 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  m *p.){.  const 
3d10: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73  char *zDb;.  ass
3d20: 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d  ert( p->pSchema=
3d30: 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61  =0 || p->zDataba
3d40: 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  se==0 );.  if( p
3d50: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3d60: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
3d70: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
3d80: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3d90: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62  Schema);.    zDb
3da0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
3db0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
3dc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3dd0: 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73  Db = p->zDatabas
3de0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
3df0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3e00: 6c 65 28 70 50 61 72 73 65 2c 20 66 6c 61 67 73  le(pParse, flags
3e10: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  , p->zName, zDb)
3e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
3e30: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
3e40: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
3e50: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
3e60: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
3e70: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
3e80: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
3e90: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
3ea0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
3eb0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
3ec0: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
3ed0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
3ee0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
3ef0: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
3f00: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
3f10: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
3f20: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
3f30: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
3f40: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
3f50: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
3f60: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
3f70: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
3f80: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
3f90: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
3fa0: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
3fb0: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
3fc0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
3fd0: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
3fe0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
3ff0: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
4000: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
4010: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
4020: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
4030: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
4040: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
4050: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f 2a  0;.  int i;.  /*
4060: 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65   All mutexes are
4070: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63   required for sc
4080: 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61  hema access.  Ma
4090: 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20  ke sure we hold 
40a0: 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72  them. */.  asser
40b0: 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c  t( zDb!=0 || sql
40c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
40d0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
40e0: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
40f0: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
4100: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
4110: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
4120: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
4130: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
4140: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
4150: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
4160: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
4170: 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20  assert( pSchema 
4180: 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  );.    if( zDb &
4190: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
41a0: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
41b0: 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20 63 6f 6e  .zDbSName) ) con
41c0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
41d0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
41e0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
41f0: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
4200: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4210: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4220: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , zName);.    if
4230: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
4240: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4250: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68  /*.** Reclaim th
4260: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  e memory used by
4270: 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69   an index.*/.voi
4280: 64 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64  d sqlite3FreeInd
4290: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
42a0: 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64  Index *p){.#ifnd
42b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
42c0: 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33  NALYZE.  sqlite3
42d0: 44 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c  DeleteIndexSampl
42e0: 65 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69  es(db, p);.#endi
42f0: 66 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  f.  sqlite3ExprD
4300: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
4310: 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73  rtIdxWhere);.  s
4320: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4330: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  lete(db, p->aCol
4340: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
4350: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
4360: 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70 2d  olAff);.  if( p-
4370: 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71 6c  >isResized ) sql
4380: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 28  ite3DbFree(db, (
4390: 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c  void *)p->azColl
43a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
43b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
43c0: 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33  _STAT4.  sqlite3
43d0: 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77 45 73  _free(p->aiRowEs
43e0: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  t);.#endif.  sql
43f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4400: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  );.}../*.** For 
4410: 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64  the index called
4420: 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20   zIdxName which 
4430: 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  is found in the 
4440: 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a  database iDb,.**
4450: 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64   unlike that ind
4460: 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c  ex from its Tabl
4470: 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  e then remove th
4480: 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20  e index from.** 
4490: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
44a0: 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c  able and free al
44b0: 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  l memory structu
44c0: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  res associated.*
44d0: 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65 78  * with the index
44e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
44f0: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4500: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
4510: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
4520: 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65  t char *zIdxName
4530: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
4540: 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  ex;.  Hash *pHas
4550: 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  h;..  assert( sq
4560: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
4570: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
4580: 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 64   );.  pHash = &d
4590: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
45a0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
45b0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
45c0: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
45d0: 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b 0a  , zIdxName, 0);.
45e0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
45f0: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
4600: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
4610: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
4620: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
4630: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
4640: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
4650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4660: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
4670: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
4680: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
4690: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
46a0: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
46b0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
46c0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
46d0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
46e0: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
46f0: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
4700: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
4710: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
4720: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
4730: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
4740: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
4750: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
4760: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4770: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
4780: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65 65  .    sqlite3Free
4790: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
47a0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62  );.  }.  db->mDb
47b0: 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
47c0: 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a  SchemaChange;.}.
47d0: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f  ./*.** Look thro
47e0: 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ugh the list of 
47f0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
4800: 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  les in db->aDb[]
4810: 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68   and if.** any h
4820: 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  ave been closed,
4830: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
4840: 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61  m the list.  Rea
4850: 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64  llocate the.** d
4860: 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75  b->aDb[] structu
4870: 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20  re to a smaller 
4880: 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  size, if possibl
4890: 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30  e..**.** Entry 0
48a0: 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74   (the "main" dat
48b0: 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79  abase) and entry
48c0: 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64   1 (the "temp" d
48d0: 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20  atabase).** are 
48e0: 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73  never candidates
48f0: 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61   for being colla
4900: 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  psed..*/.void sq
4910: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
4920: 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74  abaseArray(sqlit
4930: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
4940: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  , j;.  for(i=j=2
4950: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
4960: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
4970: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4980: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4990: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
49a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
49b0: 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  db, pDb->zDbSNam
49c0: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
49d0: 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  DbSName = 0;.   
49e0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
49f0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29   }.    if( j<i )
4a00: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  {.      db->aDb[
4a10: 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b  j] = db->aDb[i];
4a20: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
4a30: 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20    }.  db->nDb = 
4a40: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
4a50: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
4a60: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
4a70: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
4a80: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
4a90: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
4aa0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
4ab0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4ac0: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
4ad0: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
4ae0: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
4af0: 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73  *.** Reset the s
4b00: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61  chema for the da
4b10: 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20  tabase at index 
4b20: 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74  iDb.  Also reset
4b30: 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68   the.** TEMP sch
4b40: 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65 74 20  ema.  The reset 
4b50: 69 73 20 64 65 66 65 72 72 65 64 20 69 66 20 64  is deferred if d
4b60: 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20 69  b->nSchemaLock i
4b70: 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44  s not zero..** D
4b80: 65 66 65 72 72 65 64 20 72 65 73 65 74 73 20 6d  eferred resets m
4b90: 61 79 20 62 65 20 72 75 6e 20 62 79 20 63 61 6c  ay be run by cal
4ba0: 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c 30 2e  ling with iDb<0.
4bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4bc0: 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73  ResetOneSchema(s
4bd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4be0: 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  iDb){.  int i;. 
4bf0: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
4c00: 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  >nDb );..  if( i
4c10: 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
4c20: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4c30: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4c40: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 44  iDb, 0) );.    D
4c50: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
4c60: 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74 57 61   iDb, DB_ResetWa
4c70: 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53 65 74  nted);.    DbSet
4c80: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20  Property(db, 1, 
4c90: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
4ca0: 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67  .    db->mDbFlag
4cb0: 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68  s &= ~DBFLAG_Sch
4cc0: 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a  emaKnownOk;.  }.
4cd0: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
4ce0: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
4cf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
4d00: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
4d10: 69 66 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  if( DbHasPropert
4d20: 79 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65  y(db, i, DB_Rese
4d30: 74 57 61 6e 74 65 64 29 20 29 7b 0a 20 20 20 20  tWanted) ){.    
4d40: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4d50: 61 43 6c 65 61 72 4f 72 44 69 73 63 6f 6e 6e 65  aClearOrDisconne
4d60: 63 74 28 64 62 2c 20 69 29 3b 0a 20 20 20 20 20  ct(db, i);.     
4d70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4d80: 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
4d90: 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
4da0: 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61  on from all atta
4db0: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28  ched databases (
4dc0: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61  including.** "ma
4dd0: 69 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20  in" and "temp") 
4de0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
4df0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4e00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4e10: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
4e20: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c  OfConnection(sql
4e30: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
4e40: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   i;.  sqlite3Btr
4e50: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
4e60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4e70: 3e 6e 44 62 3b 20 69 3d 28 69 3f 69 2b 31 3a 32  >nDb; i=(i?i+1:2
4e80: 29 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  )){.    Db *pDb 
4e90: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4ea0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
4eb0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ema ){.      if(
4ec0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
4ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4ee0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4ef0: 72 4f 72 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  rOrDisconnect(db
4f00: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , i);.      }els
4f10: 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65 74  e{.        DbSet
4f20: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
4f30: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
4f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4f50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65   }.  sqlite3Sche
4f60: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
4f70: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  1].pSchema);.  d
4f80: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
4f90: 28 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  (DBFLAG_SchemaCh
4fa0: 61 6e 67 65 7c 44 42 46 4c 41 47 5f 53 63 68 65  ange|DBFLAG_Sche
4fb0: 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71  maKnownOk);.  sq
4fc0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
4fd0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
4fe0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4ff0: 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  db);.  if( db->n
5000: 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b  SchemaLock==0 ){
5010: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c  .    sqlite3Coll
5020: 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61  apseDatabaseArra
5030: 79 28 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  y(db);.  }.}../*
5040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5050: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
5060: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
5070: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5080: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
5090: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
50a0: 62 29 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61  b){.  db->mDbFla
50b0: 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63  gs &= ~DBFLAG_Sc
50c0: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  hemaChange;.}../
50d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f  *.** Delete memo
50e0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
50f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
5100: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  s of a table or 
5110: 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62  view (the.** Tab
5120: 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29  le.aCol[] array)
5130: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5140: 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
5150: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
5160: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
5170: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
5180: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
5190: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
51a0: 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54    if( (pCol = pT
51b0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29  able->aCol)!=0 )
51c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
51d0: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
51e0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
51f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5200: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  (db, pCol->zName
5210: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5220: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5230: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
5240: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5250: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  (db, pCol->zColl
5260: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5270: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5280: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20  Table->aCol);.  
5290: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
52a0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
52b0: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
52c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
52d0: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
52e0: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
52f0: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
5300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
5310: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5320: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
5330: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
5340: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
5350: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
5360: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
5370: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
5380: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
5390: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
53a0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
53b0: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
53c0: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
53d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
53e0: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
53f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61  .**.** The db pa
5400: 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f  rameter is optio
5410: 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64  nal.  It is need
5420: 65 64 20 69 66 20 74 68 65 20 54 61 62 6c 65 20  ed if the Table 
5430: 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61  object .** conta
5440: 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  ins lookaside me
5450: 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62  mory.  (Table ob
5460: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 63 68  jects in the sch
5470: 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a  ema do not use.*
5480: 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  * lookaside memo
5490: 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68  ry, but some eph
54a0: 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
54b0: 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68  ects do.)  Or th
54c0: 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65  e.** db paramete
54d0: 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  r can be used wi
54e0: 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  th db->pnBytesFr
54f0: 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74  eed to measure t
5500: 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65  he memory.** use
5510: 64 20 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f  d by the Table o
5520: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
5530: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
5540: 4e 4c 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c  NLINE deleteTabl
5550: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  e(sqlite3 *db, T
5560: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
5570: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
5580: 2a 70 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20  *pNext;..#ifdef 
5590: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
55a0: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
55b0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
55c0: 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c  ng lookaside all
55d0: 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65  ocations in sche
55e0: 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70  ma Tables.  ** p
55f0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e  rior to doing an
5600: 79 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69  y free() operati
5610: 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65  ons.  Since sche
5620: 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74  ma Tables do not
5630: 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73   use.  ** lookas
5640: 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72  ide, this number
5650: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e   should not chan
5660: 67 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ge. */.  int nLo
5670: 6f 6b 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69  okaside = 0;.  i
5680: 66 28 20 64 62 20 26 26 20 28 70 54 61 62 6c 65  f( db && (pTable
5690: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
56a0: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b  Ephemeral)==0 ){
56b0: 0a 20 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  .    nLookaside 
56c0: 3d 20 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69  = sqlite3Lookasi
56d0: 64 65 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20  deUsed(db, 0);. 
56e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
56f0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
5700: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
5710: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
5720: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
5730: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
5740: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
5750: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
5760: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
5770: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
5780: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
5790: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a  pTable->pSchema.
57a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56           || (IsV
57b0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26  irtual(pTable) &
57c0: 26 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70  & pIndex->idxTyp
57d0: 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
57e0: 45 5f 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20  E_APPDEF) );.   
57f0: 20 69 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64   if( (db==0 || d
5800: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5810: 3d 30 29 20 26 26 20 21 49 73 56 69 72 74 75 61  =0) && !IsVirtua
5820: 6c 28 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  l(pTable) ){.   
5830: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
5840: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20   pIndex->zName; 
5850: 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20  .      TESTONLY 
5860: 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20  ( Index *pOld = 
5870: 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  ) sqlite3HashIns
5880: 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26 70  ert(.         &p
5890: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
58a0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
58b0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
58c0: 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c   assert( db==0 |
58d0: 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  | sqlite3SchemaM
58e0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
58f0: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
5900: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5910: 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c  ( pOld==pIndex |
5920: 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20  | pOld==0 );.   
5930: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72   }.    sqlite3Fr
5940: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
5950: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ex);.  }..  /* D
5960: 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67  elete any foreig
5970: 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65 64 20  n keys attached 
5980: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  to this table. *
5990: 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c  /.  sqlite3FkDel
59a0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ete(db, pTable);
59b0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
59c0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
59d0: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
59e0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
59f0: 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
5a00: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
5a10: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
5a20: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
5a30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5a40: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
5a50: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
5a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
5a70: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
5a80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5a90: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
5aa0: 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e 64 65  >pCheck);.#ifnde
5ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
5ac0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
5ad0: 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 64 62  ite3VtabClear(db
5ae0: 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69  , pTable);.#endi
5af0: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
5b00: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
5b10: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
5b20: 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65   no lookaside me
5b30: 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20 62 79  mory was used by
5b40: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 2a   schema tables *
5b50: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f  /.  assert( nLoo
5b60: 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f  kaside==0 || nLo
5b70: 6f 6b 61 73 69 64 65 3d 3d 73 71 6c 69 74 65 33  okaside==sqlite3
5b80: 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62  LookasideUsed(db
5b90: 2c 30 29 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  ,0) );.}.void sq
5ba0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
5bb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
5bc0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
5bd0: 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  /* Do not delete
5be0: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c   the table until
5bf0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
5c00: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
5c10: 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61  o. */.  if( !pTa
5c20: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
5c30: 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62 2d  if( ((!db || db-
5c40: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5c50: 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e  ) && (--pTable->
5c60: 6e 54 61 62 52 65 66 29 3e 30 29 20 29 20 72 65  nTabRef)>0) ) re
5c70: 74 75 72 6e 3b 0a 20 20 64 65 6c 65 74 65 54 61  turn;.  deleteTa
5c80: 62 6c 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ble(db, pTable);
5c90: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  .}.../*.** Unlin
5ca0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
5cb0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
5cc0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
5cd0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
5ce0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
5cf0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
5d00: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
5d10: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
5d20: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
5d30: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5d40: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
5d50: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
5d60: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
5d70: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
5d80: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
5d90: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
5da0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
5db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
5dc0: 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  bName );.  asser
5dd0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
5de0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
5df0: 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63  b, 0) );.  testc
5e00: 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  ase( zTabName[0]
5e10: 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d  ==0 );  /* Zero-
5e20: 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d  length table nam
5e30: 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a  es are allowed *
5e40: 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  /.  pDb = &db->a
5e50: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
5e60: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
5e70: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
5e80: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
5e90: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
5ea0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
5eb0: 70 29 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61  p);.  db->mDbFla
5ec0: 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
5ed0: 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  emaChange;.}../*
5ee0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
5ef0: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
5f00: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
5f10: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
5f20: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
5f30: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5f40: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
5f50: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
5f60: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
5f70: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
5f80: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
5f90: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
5fa0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
5fb0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
5fc0: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
5fd0: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
5fe0: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
5ff0: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
6000: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
6010: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
6020: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
6030: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
6040: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
6050: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
6060: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
6070: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
6080: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
6090: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
60a0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
60b0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
60c0: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
60d0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
60e0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
60f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
6100: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
6110: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
6120: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
6130: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
6140: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
6150: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
6160: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
6170: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
6180: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
6190: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
61a0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
61b0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
61c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
61d0: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
61e0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
61f0: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
6200: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
6210: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
6220: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
6230: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
6240: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
6250: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
6260: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
6270: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
6280: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
6290: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
62a0: 31 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 3b  1, MASTER_NAME);
62b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
62c0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
62d0: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
62e0: 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29  ER_ROOT, iDb, 5)
62f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d  ;.  if( p->nTab=
6300: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61  =0 ){.    p->nTa
6310: 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b = 1;.  }.}../*
6320: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
6330: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
6340: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62  nul-terminated b
6350: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
6360: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
6370: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
6380: 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68  n", "temp" or th
6390: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
63a0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a  ached db). This.
63b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
63c0: 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66  rns the index of
63d0: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
63e0: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
63f0: 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68  , or.** -1 if th
6400: 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f  e named db canno
6410: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
6420: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
6430: 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Name(sqlite3 *db
6440: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
6450: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
6460: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  -1;         /* D
6470: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
6480: 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  /.  if( zName ){
6490: 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  .    Db *pDb;.  
64a0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
64b0: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
64c0: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
64d0: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
64e0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
64f0: 72 69 63 6d 70 28 70 44 62 2d 3e 7a 44 62 53 4e  ricmp(pDb->zDbSN
6500: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72  ame, zName) ) br
6510: 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 22 6d  eak;.      /* "m
6520: 61 69 6e 22 20 69 73 20 61 6c 77 61 79 73 20 61  ain" is always a
6530: 6e 20 61 63 63 65 70 74 61 62 6c 65 20 61 6c 69  n acceptable ali
6540: 61 73 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  as for the prima
6550: 72 79 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ry database.    
6560: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20    ** even if it 
6570: 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  has been renamed
6580: 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42   using SQLITE_DB
6590: 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d  CONFIG_MAINDBNAM
65a0: 45 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  E. */.      if( 
65b0: 69 3d 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  i==0 && 0==sqlit
65c0: 65 33 5f 73 74 72 69 63 6d 70 28 22 6d 61 69 6e  e3_stricmp("main
65d0: 22 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61  ", zName) ) brea
65e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
65f0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
6600: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
6610: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
6620: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
6630: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
6640: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
6650: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
6660: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
6670: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6680: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
6690: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
66a0: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
66b0: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
66c0: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
66d0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
66e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
66f0: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
6700: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
6710: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6740: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
6750: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61      /* Name we a
6780: 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  re searching for
6790: 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
67a0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
67b0: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
67c0: 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   i = sqlite3Find
67d0: 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65  DbName(db, zName
67e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
67f0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
6800: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
6810: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
6820: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
6830: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
6840: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
6850: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
6860: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
6870: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
6880: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
6890: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
68a0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
68b0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
68c0: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
68d0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
68e0: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
68f0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6900: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
6910: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
6920: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
6930: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
6940: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
6950: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
6960: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
6970: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
6980: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
6990: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
69a0: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
69b0: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
69c0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
69d0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
69e0: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
69f0: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
6a00: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
6a10: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
6a20: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
6a30: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
6a40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a50: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
6a60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
6a80: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
6a90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
6aa0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6ab0: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
6ac0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
6ad0: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
6ae0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6af0: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
6b00: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
6b10: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
6b20: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
6b30: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6b40: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
6b50: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
6b60: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
6b90: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
6ba0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6bb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
6bd0: 32 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  2!=0 );.  if( pN
6be0: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
6bf0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6c00: 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c  sy ) {.      sql
6c10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6c20: 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61  rse, "corrupt da
6c30: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
6c40: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
6c50: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
6c60: 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20  pName2;.    iDb 
6c70: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
6c80: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
6c90: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
6ca0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6cb0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
6cc0: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54  nown database %T
6cd0: 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  ", pName1);.    
6ce0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
6cf0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6d00: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
6d10: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
6d20: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 49 4e 5f 52  nit.busy || IN_R
6d30: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 0a 20 20 20  ENAME_OBJECT.   
6d40: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 64 62            || (db
6d50: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46  ->mDbFlags & DBF
6d60: 4c 41 47 5f 56 61 63 75 75 6d 29 21 3d 30 29 3b  LAG_Vacuum)!=0);
6d70: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
6d80: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
6d90: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
6da0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
6db0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20  ;.}../*.** True 
6dc0: 69 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  if PRAGMA writab
6dd0: 6c 65 5f 73 63 68 65 6d 61 20 69 73 20 4f 4e 0a  le_schema is ON.
6de0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 72  */.int sqlite3Wr
6df0: 69 74 61 62 6c 65 53 63 68 65 6d 61 28 73 71 6c  itableSchema(sql
6e00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 74 65 73  ite3 *db){.  tes
6e10: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6e20: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6e30: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6e40: 65 6e 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20  ensive))==0 );. 
6e50: 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e   testcase( (db->
6e60: 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72  flags&(SQLITE_Wr
6e70: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6e80: 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20  _Defensive))==. 
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
6ea0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
6eb0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
6ec0: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
6ed0: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
6ee0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
6ef0: 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )==.            
6f00: 20 20 20 53 51 4c 49 54 45 5f 44 65 66 65 6e 73     SQLITE_Defens
6f10: 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ive );.  testcas
6f20: 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53  e( (db->flags&(S
6f30: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
6f40: 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69  a|SQLITE_Defensi
6f50: 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20  ve))==.         
6f60: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 57 72        (SQLITE_Wr
6f70: 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45  iteSchema|SQLITE
6f80: 5f 44 65 66 65 6e 73 69 76 65 29 20 29 3b 0a 20  _Defensive) );. 
6f90: 20 72 65 74 75 72 6e 20 28 64 62 2d 3e 66 6c 61   return (db->fla
6fa0: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
6fb0: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
6fc0: 66 65 6e 73 69 76 65 29 29 3d 3d 53 51 4c 49 54  fensive))==SQLIT
6fd0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 3b 0a 7d  E_WriteSchema;.}
6fe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6ff0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
7000: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
7010: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
7020: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
7030: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
7040: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
7050: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
7060: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
7070: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
7080: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
7090: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
70a0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
70b0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
70c0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
70d0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
70e0: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
70f0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
7100: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
7110: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
7120: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
7130: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
7140: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7160: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
7170: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
7180: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
7190: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
71a0: 20 20 26 26 20 73 71 6c 69 74 65 33 57 72 69 74    && sqlite3Writ
71b0: 61 62 6c 65 53 63 68 65 6d 61 28 70 50 61 72 73  ableSchema(pPars
71c0: 65 2d 3e 64 62 29 3d 3d 30 0a 20 20 20 20 20 20  e->db)==0.      
71d0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
71e0: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
71f0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
7200: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7210: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
7220: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
7230: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
7240: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
7250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
7260: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
7270: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7280: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
7290: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
72a0: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
72b0: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
72c0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
72d0: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
72e0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
72f0: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
7300: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
7310: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
7320: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
7330: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7340: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7350: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
7360: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
7370: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
7380: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
7390: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
73a0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
73b0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
73c0: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
73d0: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
73e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
73f0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
7400: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
7410: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
7420: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
7430: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
7440: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
7450: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
7460: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
7470: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
7480: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
7490: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
74a0: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
74b0: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
74c0: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
74d0: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
74e0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
74f0: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
7500: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
7510: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
7520: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
7530: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
7540: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
7550: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
7560: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
7570: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
7580: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
7590: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
75a0: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
75b0: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
75c0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
75d0: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
75e0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
75f0: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
7600: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
7610: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
7620: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
7630: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
7640: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
7650: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
7660: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
7670: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
7680: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
7690: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
76a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
76b0: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
76c0: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
76d0: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
76e0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
76f0: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
7700: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
7710: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
7720: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
7730: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7740: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
7750: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
7760: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
7770: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
7780: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
7790: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
77a0: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
77b0: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
77c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
77d0: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
77e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
77f0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
7800: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
7810: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
7820: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
7830: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
7840: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
7850: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
7860: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
7870: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
7880: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
7890: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
78a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
78b0: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
78c0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
78d0: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
78e0: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
78f0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
7900: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
7910: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
7920: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
7930: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
7940: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
7950: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
7960: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
7970: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
7980: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
7990: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
79a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
79b0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
79c0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
79d0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
79e0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
79f0: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
7a00: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
7a10: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
7a20: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
7a30: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
7a40: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
7a50: 73 79 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  sy && db->init.n
7a60: 65 77 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20  ewTnum==1 ){.   
7a70: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
7a80: 3a 20 20 50 61 72 73 69 6e 67 20 74 68 65 20 73  :  Parsing the s
7a90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20  qlite_master or 
7aa0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
7ab0: 65 72 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20  er schema */.   
7ac0: 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e   iDb = db->init.
7ad0: 69 44 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  iDb;.    zName =
7ae0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
7af0: 28 64 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  (db, SCHEMA_TABL
7b00: 45 28 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61  E(iDb));.    pNa
7b10: 6d 65 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  me = pName1;.  }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
7b30: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
7b40: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
7b50: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
7b60: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
7b70: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
7b80: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
7b90: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f  turn;.    if( !O
7ba0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
7bb0: 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e  Temp && pName2->
7bc0: 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b  n>0 && iDb!=1 ){
7bd0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65  .      /* If cre
7be0: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
7bf0: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
7c00: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
7c10: 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20  d. Unless .     
7c20: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7c30: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
7c40: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
7c50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7c60: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
7c70: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
7c80: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
7c90: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ied");.      ret
7ca0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
7cb0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7cc0: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
7cd0: 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  = 1;.    zName =
7ce0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
7cf0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
7d00: 3b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e  ;.    if( IN_REN
7d10: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
7d20: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
7d30: 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65  eTokenMap(pParse
7d40: 2c 20 28 76 6f 69 64 2a 29 7a 4e 61 6d 65 2c 20  , (void*)zName, 
7d50: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pName);.    }.  
7d60: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  }.  pParse->sNam
7d70: 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b  eToken = *pName;
7d80: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
7d90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7da0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7db0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
7dc0: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
7dd0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
7de0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7df0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
7e00: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
7e10: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
7e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
7e30: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
7e40: 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c  rt( isTemp==0 ||
7e50: 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20   isTemp==1 );.  
7e60: 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d  assert( isView==
7e70: 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20 29  0 || isView==1 )
7e80: 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ;.  {.    static
7e90: 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65 5b   const u8 aCode[
7ea0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51 4c  ] = {.       SQL
7eb0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
7ec0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
7ed0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
7ee0: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
7ef0: 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20 20  _CREATE_VIEW,.  
7f00: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
7f10: 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20 20  TE_TEMP_VIEW.   
7f20: 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   };.    char *zD
7f30: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
7f40: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
7f50: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
7f60: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
7f70: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
7f80: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
7f90: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
7fa0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7fb0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7fc0: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
7fd0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
7fe0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28  hCheck(pParse, (
7ff0: 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70  int)aCode[isTemp
8000: 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20  +2*isView],.    
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62     zName, 0, zDb
8040: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
8050: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
8060: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
8070: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
8080: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
8090: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
80a0: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
80b0: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
80c0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
80d0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  e in the same da
80e0: 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61  tabase.  Issue a
80f0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8100: 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e  if.  ** it does.
8110: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
8120: 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  s if the stateme
8130: 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20  nt being parsed 
8140: 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20  was passed.  ** 
8150: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65  to an sqlite3_de
8160: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c  clare_vtab() cal
8170: 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  l. In that case 
8180: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
8190: 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74  names.  ** and t
81a0: 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  ypes will be use
81b0: 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  d, so there is n
81c0: 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66  o need to test f
81d0: 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a  or namespace.  *
81e0: 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  * collisions..  
81f0: 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 53 50 45  */.  if( !IN_SPE
8200: 43 49 41 4c 5f 50 41 52 53 45 20 29 7b 0a 20 20  CIAL_PARSE ){.  
8210: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
8220: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
8230: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 21 49 73  ame;.    if( !Is
8240: 53 68 61 72 65 64 53 63 68 65 6d 61 28 64 62 29  SharedSchema(db)
8250: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73   && SQLITE_OK!=s
8260: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
8270: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
8280: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
8290: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
82a0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
82b0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
82c0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
82d0: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
82e0: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
82f0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
8300: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8310: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
8320: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
8330: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
8340: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
8350: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
8360: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
8370: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
8380: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
8390: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
83a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
83b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
83c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
83d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
83e0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
83f0: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
8400: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8410: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
8420: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
8430: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
8440: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
8450: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
8460: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
8470: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
8480: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8490: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
84a0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
84b0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
84c0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
84d0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
84e0: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
84f0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
8500: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
8510: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
8520: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
8530: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
8540: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
8550: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
8560: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
8570: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
8580: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
8590: 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  le->nTabRef = 1;
85a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
85b0: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20  EFAULT_ROWEST.  
85c0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
85d0: 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
85e0: 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  st(SQLITE_DEFAUL
85f0: 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65  T_ROWEST);.#else
8600: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
8610: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
8620: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
8630: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
8640: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
8650: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
8660: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
8670: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8680: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
8690: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
86a0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
86b0: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
86c0: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
86d0: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
86e0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
86f0: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
8700: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
8710: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
8720: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
8730: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
8740: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
8750: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8760: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
8770: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
8780: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
8790: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
87a0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
87b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
87c0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
87d0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
87e0: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
87f0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
8800: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
8810: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
8820: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
8830: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
8840: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
8850: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
8860: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
8870: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
8880: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
8890: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
88a0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
88b0: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
88c0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
88d0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
88e0: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
88f0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
8900: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
8910: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
8920: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
8930: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
8940: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
8950: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
8960: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
8970: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
8980: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
8990: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
89a0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
89b0: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
89c0: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
89d0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
89e0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
89f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8a00: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
8a10: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
8a20: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
8a30: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
8a40: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
8a50: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
8a60: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
8a70: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
8a80: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
8a90: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
8aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
8ab0: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
8ac0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
8ad0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
8ae0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8af0: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
8b00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8b10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8b20: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
8b30: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
8b40: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
8b50: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
8b60: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
8b70: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
8b80: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
8b90: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
8ba0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
8bb0: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
8bc0: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
8bd0: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
8be0: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
8bf0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8c00: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
8c10: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
8c20: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8c30: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
8c40: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
8c50: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8c60: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
8c70: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
8c80: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
8c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
8ca0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
8cb0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
8cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8cd0: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
8ce0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8cf0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
8d00: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8d10: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
8d20: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
8d30: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
8d40: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
8d50: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
8d60: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8d70: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
8d80: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
8d90: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
8da0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8db0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8dc0: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8dd0: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
8de0: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
8df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
8e00: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
8e10: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
8e20: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
8e30: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
8e40: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
8e50: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
8e60: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
8e70: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
8e80: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
8e90: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
8ea0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
8eb0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
8ec0: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
8ed0: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
8ee0: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
8ef0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
8f00: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
8f10: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
8f20: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
8f30: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
8f40: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
8f50: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
8f60: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
8f70: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
8f80: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
8f90: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
8fa0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
8fb0: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
8fc0: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
8fd0: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
8fe0: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
8ff0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
9000: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9010: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
9020: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9030: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9040: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
9050: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
9060: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9070: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9080: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
9090: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
90a0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
90b0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
90c0: 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71  ab =.         sq
90d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
90e0: 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
90f0: 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54  e, iDb, reg2, BT
9100: 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20  REE_INTKEY);.   
9110: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
9120: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
9130: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
9140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9150: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
9160: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
9170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9180: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
9190: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
91a0: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
91b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
91c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
91d0: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
91e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
91f0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
9200: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
9210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9220: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
9230: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
9240: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
9250: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
9260: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
9270: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
9280: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
9290: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
92a0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
92b0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
92c0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
92d0: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
92e0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
92f0: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
9300: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
9310: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
9320: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
9330: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
9340: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
9350: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
9360: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
9370: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
9380: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
9390: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
93a0: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
93b0: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
93c0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
93d0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
93e0: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
93f0: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
9400: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
9410: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
9420: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
9430: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
9440: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
9450: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
9460: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
9470: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
9480: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9490: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
94a0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
94b0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
94c0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
94d0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
94e0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
94f0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
9500: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
9510: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
9520: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
9530: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
9540: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
9550: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9560: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
9570: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
9580: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9590: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
95a0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
95b0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
95c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
95d0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
95e0: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
95f0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
9600: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9610: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
9620: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
9630: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
9640: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
9650: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
9660: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
9670: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
9680: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9690: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
96a0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
96b0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
96c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
96d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
96e0: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
96f0: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
9700: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
9710: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f  eturn;.  if( IN_
9720: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20  RENAME_OBJECT ) 
9730: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
9740: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
9750: 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a  oid*)z, pName);.
9760: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
9770: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
9780: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
9790: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
97a0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
97b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
97c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
97d0: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
97e0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
97f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
9800: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9810: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
9820: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
9830: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
9840: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9850: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
9860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
9870: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
9880: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
9890: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
98a0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
98b0: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
98c0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
98d0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
98e0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
98f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9900: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
9910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
9920: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
9930: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
9940: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
9950: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
9960: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
9970: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
9980: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
9990: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
99a0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
99b0: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
99c0: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
99d0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
99e0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
99f0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
9a00: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
9a10: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
9a20: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
9a30: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
9a40: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
9a50: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9a60: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
9a70: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
9a80: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
9a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
9aa0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
9ab0: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
9ac0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9ad0: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9ae0: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9af0: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9b00: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9b10: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9b20: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
9b30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9b40: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
9b50: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
9b60: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
9b70: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
9b80: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
9b90: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
9ba0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
9bb0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
9bc0: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
9bd0: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
9be0: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
9bf0: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
9c00: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
9c10: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
9c20: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
9c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9c40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9c50: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
9c60: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
9c70: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
9c80: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
9c90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
9ca0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
9cb0: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
9cc0: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
9cd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9ce0: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9cf0: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9d00: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9d10: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9d20: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9d30: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9d40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
9d50: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
9d60: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9d70: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
9d80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9d90: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9da0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9db0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9dc0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9dd0: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9de0: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9df0: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9e00: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9e10: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9e20: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9e30: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9e40: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
9e50: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
9e60: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
9e70: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
9e80: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
9e90: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
9ea0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9eb0: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
9ec0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9ed0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9ee0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9ef0: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9f00: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9f10: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9f20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9f30: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9f40: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
9f50: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
9f60: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
9f70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
9f80: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
9f90: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
9fa0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
9fb0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
9fc0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
9fd0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9fe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9ff0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
a000: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
a010: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
a020: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
a030: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
a040: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
a050: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
a060: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
a070: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
a080: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
a090: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
a0a0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
a0b0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
a0c0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
a0d0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
a0e0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
a0f0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
a100: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
a110: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
a120: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
a130: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
a140: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
a150: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
a160: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a190: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
a1a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
a1b0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
a1c0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
a1d0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
a1e0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
a1f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
a200: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
a210: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
a220: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
a230: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
a240: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
a250: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
a260: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
a270: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
a280: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
a290: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
a2a0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
a2b0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
a2c0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
a2d0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
a2e0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
a2f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
a300: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
a310: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
a320: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
a330: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
a340: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
a350: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
a360: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
a370: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
a380: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
a390: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
a3a0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
a3b0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
a3c0: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
a3d0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
a3e0: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
a3f0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
a400: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
a410: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
a420: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
a430: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
a440: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
a450: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
a460: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
a470: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
a480: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
a490: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
a4a0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
a4b0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
a4c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
a4d0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
a4e0: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
a4f0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
a500: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
a510: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
a520: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
a530: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
a540: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
a550: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
a560: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
a570: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
a580: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
a590: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
a5a0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
a5b0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
a5c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
a5d0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
a5e0: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
a5f0: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
a600: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
a610: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
a620: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
a630: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
a640: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
a650: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
a660: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
a670: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
a680: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
a690: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
a6a0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
a6b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
a6c0: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
a6d0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
a6e0: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
a6f0: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
a700: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
a710: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
a720: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
a730: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
a740: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
a750: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
a760: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
a770: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
a780: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
a790: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
a7a0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
a7b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
a7c0: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
a7d0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
a7e0: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
a7f0: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
a800: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
a810: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
a820: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
a830: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
a840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
a850: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
a860: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
a870: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
a880: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
a890: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
a8a0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
a8b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
a8c0: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
a8d0: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
a8e0: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
a8f0: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
a900: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
a910: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
a920: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
a930: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
a940: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
a950: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
a960: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
a970: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
a980: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
a990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
a9a0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
a9b0: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
a9c0: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
a9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
a9e0: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
a9f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
aa00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
aa10: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
aa20: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
aa30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa40: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
aa50: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
aa60: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
aa70: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
aa80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
aa90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
aaa0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
aab0: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
aac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
aad0: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
aae0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
aaf0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
ab00: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
ab10: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
ab20: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
ab30: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
ab40: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
ab50: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
ab60: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
ab70: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
ab80: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
ab90: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
aba0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
abb0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
abc0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
abd0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
abe0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
abf0: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
ac00: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
ac10: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
ac20: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
ac30: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
ac40: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
ac50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ac60: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
ac70: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
ac80: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
ac90: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
aca0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
acb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
acc0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
acd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ace0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
acf0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
ad00: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad20: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
ad30: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
ad40: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
ad50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
ad60: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
ad70: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
ad80: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
ad90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
ada0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
adb0: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
adc0: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
add0: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
ade0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
adf0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
ae00: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ae10: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
ae20: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ae30: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
ae40: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
ae50: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
ae60: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
ae70: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
ae80: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
ae90: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
aea0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
aeb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
aec0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
aed0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
aee0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
aef0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
af00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
af10: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
af20: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
af30: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
af40: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
af50: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
af60: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
af70: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
af80: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
af90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
afa0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
afb0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
afc0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
afd0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
afe0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
aff0: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
b000: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
b010: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
b020: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
b030: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
b040: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
b050: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
b060: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
b070: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
b080: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b090: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
b0a0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
b0b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b0c0: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
b0d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49     }.  }.  if( I
b0e0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
b0f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
b100: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
b110: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
b120: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
b130: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
b140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
b150: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
b160: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
b170: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
b180: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
b190: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
b1a0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
b1b0: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
b1c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
b1d0: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
b1e0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
b1f0: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
b200: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
b210: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
b220: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
b230: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
b240: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
b250: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
b260: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
b270: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
b280: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
b290: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
b2a0: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
b2b0: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
b2c0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
b2d0: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
b2e0: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
b2f0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
b300: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
b310: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
b320: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
b330: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
b340: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
b350: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
b360: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
b370: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
b380: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
b390: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
b3a0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
b3b0: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
b3c0: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
b3d0: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
b3e0: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
b3f0: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
b400: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
b410: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
b420: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
b430: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
b440: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
b450: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
b460: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
b470: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
b480: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
b490: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
b4a0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
b4b0: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
b4c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
b4d0: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
b4e0: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
b4f0: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
b500: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
b510: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
b520: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
b530: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
b540: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
b550: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
b560: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
b570: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
b580: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
b590: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
b5a0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
b5b0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
b5c0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
b5d0: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
b5e0: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
b5f0: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
b600: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
b610: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
b620: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
b630: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
b640: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
b650: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
b660: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
b670: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
b680: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
b690: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
b6a0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
b6b0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
b6c0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
b6d0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
b6e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
b6f0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
b700: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
b710: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
b720: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
b730: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
b740: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
b750: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b760: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
b770: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
b780: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b790: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
b7a0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
b7b0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
b7c0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
b7d0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
b7e0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
b7f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
b800: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
b810: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
b820: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b830: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
b840: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
b850: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
b860: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
b870: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
b880: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
b890: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
b8a0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
b8b0: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
b8c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
b8d0: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
b8e0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
b8f0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
b900: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
b910: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
b920: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
b930: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
b940: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
b950: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
b960: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
b970: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
b980: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
b990: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
b9a0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
b9b0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
b9c0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
b9d0: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
b9e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b9f0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
ba00: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
ba10: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
ba20: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
ba30: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ba40: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
ba50: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
ba60: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
ba70: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
ba80: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
ba90: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
baa0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
bab0: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
bac0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
bad0: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
bae0: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
baf0: 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  KEY;.    nTerm =
bb00: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
bb10: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
bb20: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
bb30: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
bb40: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
bb50: 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
bb60: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
bb70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
bb80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bb90: 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20   pCExpr!=0 );.  
bba0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
bbb0: 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20  gToId(pCExpr);. 
bbc0: 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d       if( pCExpr-
bbd0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
bbe0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
bbf0: 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70   *zCName = pCExp
bc00: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
bc10: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
bc20: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
bc30: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
bc40: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
bc50: 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20  StrICmp(zCName, 
bc60: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bc70: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
bc80: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
bc90: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
bca0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l];.            
bcb0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
bcc0: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
bcd0: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  Y;.            b
bce0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
bcf0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
bd00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bd10: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
bd20: 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71  && pCol.   && sq
bd30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c  lite3StrICmp(sql
bd40: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
bd50: 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45  Col,""), "INTEGE
bd60: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
bd70: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
bd80: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
bd90: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
bda0: 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  JECT && pList ){
bdb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
bdc0: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
bdd0: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
bde0: 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Key, pList->a[0]
bdf0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
be00: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
be10: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
be20: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
be30: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
be40: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
be50: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
be60: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
be70: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
be80: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
be90: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
bea0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
beb0: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
bec0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
bed0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
bee0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
bef0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
bf00: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
bf10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bf20: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
bf30: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
bf40: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
bf50: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
bf60: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
bf70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
bf80: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
bf90: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
bfa0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
bfb0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
bfd0: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
bfe0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
bff0: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
c000: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
c010: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
c020: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
c030: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
c040: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
c050: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
c060: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
c070: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
c080: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
c090: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
c0a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
c0b0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
c0c0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
c0d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
c0e0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c0f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
c100: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
c110: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
c120: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
c130: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
c140: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c150: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c160: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
c170: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c180: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
c190: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
c1a0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
c1b0: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
c1c0: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
c1d0: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
c1e0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
c1f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c200: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
c210: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
c220: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
c230: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
c240: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
c250: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
c260: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
c270: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
c280: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
c290: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
c2a0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
c2b0: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
c2c0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
c2d0: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
c2e0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
c2f0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
c300: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
c310: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
c320: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
c330: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
c340: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
c350: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
c360: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
c370: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
c380: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
c390: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
c3a0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c3c0: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
c3d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c3e0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
c3f0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
c400: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
c410: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
c420: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
c430: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
c440: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
c450: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
c460: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
c470: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
c480: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
c490: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
c4a0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
c4b0: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
c4c0: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
c4d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
c4e0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
c4f0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
c500: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
c510: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
c520: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
c530: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
c540: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
c550: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
c560: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
c570: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
c580: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
c590: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
c5a0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
c5b0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
c5c0: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
c5d0: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
c5e0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
c5f0: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
c600: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
c610: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
c620: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
c630: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
c640: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
c650: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
c660: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
c670: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
c680: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
c690: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c6a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c6b0: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
c6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c6d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c6e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
c6f0: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
c700: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
c710: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
c720: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
c730: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
c740: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
c750: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
c760: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
c770: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
c780: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
c790: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
c7a0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
c7b0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
c7c0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
c7d0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
c7e0: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
c7f0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
c800: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
c810: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
c820: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
c830: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
c840: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
c850: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
c860: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
c870: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
c880: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
c890: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
c8a0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
c8b0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
c8c0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
c8d0: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
c8e0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
c8f0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
c900: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c910: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
c920: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
c930: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
c940: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
c950: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c960: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
c970: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
c980: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
c990: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
c9a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
c9b0: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
c9c0: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
c9d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
c9e0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
c9f0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
ca00: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
ca10: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
ca20: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
ca30: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
ca40: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
ca50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
ca60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ca70: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
ca80: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
ca90: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
caa0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
cab0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
cac0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
cad0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
cae0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
caf0: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
cb00: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
cb10: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
cb20: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
cb30: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
cb40: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
cb50: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
cb60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
cb70: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
cb80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
cb90: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
cba0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
cbb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
cbc0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
cbd0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
cbe0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
cbf0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
cc00: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
cc10: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
cc20: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
cc30: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
cc40: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
cc50: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
cc60: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
cc70: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
cc80: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
cc90: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
cca0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
ccb0: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
ccc0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
ccd0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
cce0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
ccf0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
cd00: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
cd10: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
cd20: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
cd30: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
cd40: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
cd50: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
cd60: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
cd70: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
cd80: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
cd90: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
cda0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
cdb0: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
cdc0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
cdd0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
cde0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
cdf0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
ce00: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
ce10: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
ce20: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
ce30: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
ce40: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  ough..**.** IMPL
ce50: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
ce60: 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c  -34230-56049 SQL
ce70: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
ce80: 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20  y increments.** 
ce90: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
cea0: 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  on whenever the 
ceb0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
cec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
ced0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
cee0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
cef0: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
cf00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
cf10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
cf20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
cf30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
cf40: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
cf50: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
cf60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cf70: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
cf80: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
cf90: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20  MA_VERSION, .   
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfb0: 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65  (int)(1+(unsigne
cfc0: 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  d)db->aDb[iDb].p
cfd0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
cfe0: 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ookie));.}../*.*
cff0: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
d000: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
d010: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
d020: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
d030: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
d040: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
d050: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
d060: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
d070: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
d080: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
d090: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
d0a0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
d0b0: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
d0c0: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
d0d0: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
d0e0: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
d0f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
d100: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
d110: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
d120: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
d130: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
d140: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
d150: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
d160: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
d170: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
d180: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
d190: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
d1a0: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
d1b0: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
d1c0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
d1d0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
d1e0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
d1f0: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
d200: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
d210: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
d220: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
d230: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
d240: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
d250: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
d260: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
d270: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
d280: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
d290: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
d2a0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
d2b0: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
d2c0: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
d2d0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
d2e0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
d2f0: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
d300: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
d310: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
d320: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
d330: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
d340: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
d350: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
d360: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
d370: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
d380: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
d390: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
d3a0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
d3b0: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
d3c0: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
d3d0: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
d3e0: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
d3f0: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
d400: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
d410: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
d420: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
d430: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
d440: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
d450: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
d460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
d470: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
d480: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
d490: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
d4a0: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
d4b0: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
d4c0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
d4d0: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
d4e0: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
d4f0: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
d500: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
d510: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
d520: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
d530: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
d540: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
d550: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
d560: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
d570: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
d580: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
d590: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
d5a0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
d5b0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
d5c0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
d5d0: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
d5e0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
d5f0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
d600: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
d610: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
d620: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
d630: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
d640: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
d650: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
d660: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d670: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
d680: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
d690: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
d6a0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
d6b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
d6c0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
d6d0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
d6e0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
d6f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
d700: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
d710: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
d720: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
d730: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
d740: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
d750: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
d760: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
d770: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
d780: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
d790: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
d7a0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
d7b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
d7c0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
d7d0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
d7e0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
d7f0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
d800: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
d810: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
d820: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
d830: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
d840: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
d850: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
d860: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
d870: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
d880: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
d890: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
d8a0: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
d8b0: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
d8c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
d8d0: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
d8e0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
d8f0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
d900: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
d910: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
d920: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
d930: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
d940: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
d950: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
d960: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
d970: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
d980: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
d990: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
d9a0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
d9b0: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
d9c0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
d9d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
d9e0: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
d9f0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
da00: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
da10: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
da20: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
da30: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
da40: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
da50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
da60: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
da70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
da80: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
da90: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
daa0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
dab0: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
dac0: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
dad0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
dae0: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
daf0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
db00: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
db10: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
db20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
db30: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
db40: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
db50: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
db60: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
db70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
db80: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
db90: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
dba0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
dbb0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
dbc0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
dbd0: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
dbe0: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
dbf0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
dc00: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
dc10: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
dc20: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
dc30: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
dc40: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
dc50: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
dc60: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
dc70: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
dc80: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
dc90: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
dca0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
dcb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
dcc0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
dcd0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
dce0: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
dcf0: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
dd00: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
dd10: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
dd20: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
dd30: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
dd40: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
dd50: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
dd60: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
dd70: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
dd80: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
dd90: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
dda0: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
ddb0: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
ddc0: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
ddd0: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
dde0: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
ddf0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
de00: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
de10: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
de20: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
de30: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
de40: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
de50: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
de60: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
de70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
de80: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
de90: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
dea0: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
deb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
dec0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
ded0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
dee0: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
def0: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
df00: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
df10: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
df20: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
df30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
df40: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
df50: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
df60: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
df70: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
df80: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
df90: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
dfa0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
dfb0: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
dfc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
dfd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
dfe0: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
dff0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
e000: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
e010: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
e020: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
e030: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74  onst char**)zExt
e040: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
e050: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b  sizeof(char*)*N;
e060: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
e070: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
e080: 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49  , sizeof(i16)*pI
e090: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
e0a0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
e0b0: 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20   (i16*)zExtra;. 
e0c0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
e0d0: 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63  f(i16)*N;.  memc
e0e0: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
e0f0: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64  >aSortOrder, pId
e100: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
e110: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
e120: 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20  = (u8*)zExtra;. 
e130: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
e140: 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65   N;.  pIdx->isRe
e150: 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74  sized = 1;.  ret
e160: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e170: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
e180: 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77   the total row w
e190: 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65  idth for a table
e1a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e1b0: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
e1c0: 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dth(Table *pTab)
e1d0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61  {.  unsigned wTa
e1e0: 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ble = 0;.  const
e1f0: 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
e200: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
e210: 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  (i=pTab->nCol, p
e220: 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
e230: 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61  l; i>0; i--, pTa
e240: 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61  bCol++){.    wTa
e250: 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e  ble += pTabCol->
e260: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  szEst;.  }.  if(
e270: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29   pTab->iPKey<0 )
e280: 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61   wTable++;.  pTa
e290: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
e2a0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62  lite3LogEst(wTab
e2b0: 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le*4);.}../*.** 
e2c0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
e2d0: 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72  rage size of a r
e2e0: 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  ow for an index.
e2f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e300: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
e310: 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  th(Index *pIdx){
e320: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64  .  unsigned wInd
e330: 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ex = 0;.  int i;
e340: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
e350: 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54  *aCol = pIdx->pT
e360: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f  able->aCol;.  fo
e370: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
e380: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
e390: 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e    i16 x = pIdx->
e3a0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
e3b0: 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d   assert( x<pIdx-
e3c0: 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b  >pTable->nCol );
e3d0: 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78  .    wIndex += x
e3e0: 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49  <0 ? 1 : aCol[pI
e3f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
e400: 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49  .szEst;.  }.  pI
e410: 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  dx->szIdxRow = s
e420: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e  qlite3LogEst(wIn
e430: 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  dex*4);.}../* Re
e440: 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c  turn true if val
e450: 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e  ue x is found an
e460: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
e470: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
e480: 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63  iCol[].*/.static
e490: 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63   int hasColumn(c
e4a0: 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c  onst i16 *aiCol,
e4b0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78   int nCol, int x
e4c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c  ){.  while( nCol
e4d0: 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d  -- > 0 ) if( x==
e4e0: 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74  *(aiCol++) ) ret
e4f0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
e500: 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75  0;.}../* Recompu
e510: 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78  te the colNotIdx
e520: 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ed field of the 
e530: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c  Index..**.** col
e540: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69  NotIdxed is a bi
e550: 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61  tmask that has a
e560: 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74   0 bit represent
e570: 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64  ing each indexed
e580: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
e590: 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
e5a0: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
e5b0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
e5c0: 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65  The.** high-orde
e5d0: 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49  r bit of colNotI
e5e0: 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31  dxed is always 1
e5f0: 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64  .  All unindexed
e600: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
e610: 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20  he table have a 
e620: 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  1..**.** The col
e630: 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73  NotIdxed mask is
e640: 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65   AND-ed with the
e650: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c   SrcList.a[].col
e660: 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20  Used mask.** to 
e670: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
e680: 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69   index is coveri
e690: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ng index..*/.sta
e6a0: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75  tic void recompu
e6b0: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
e6c0: 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29  xed(Index *pIdx)
e6d0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
e6e0: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
e6f0: 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
e700: 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
e710: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
e720: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
e730: 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
e740: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e750: 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
e760: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
e770: 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
e780: 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
e790: 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
e7a0: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63   }.  }.  pIdx->c
e7b0: 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b  olNotIdxed = ~m;
e7c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
e7d0: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36  ->colNotIdxed>>6
e7e0: 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3)==1 );.}../*.*
e7f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
e800: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
e810: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
e820: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e830: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
e840: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
e850: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
e860: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
e870: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
e880: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
e890: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
e8a0: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
e8b0: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
e8c0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
e8d0: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
e8e0: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
e8f0: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
e900: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
e910: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
e920: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
e930: 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c      (1)  Set all
e940: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
e950: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
e960: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
e970: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
e980: 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33   (2)  Convert P3
e990: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
e9a0: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
e9b0: 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b   from BTREE_INTK
e9c0: 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EY .**          
e9d0: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
e9e0: 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  EY..**     (3)  
e9f0: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
ea00: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
ea10: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
ea20: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
ea30: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
ea40: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
ea50: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
ea60: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
ea70: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
ea80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ea90: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
eaa0: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
eab0: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
eac0: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
ead0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
eae0: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
eaf0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
eb00: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
eb10: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
eb20: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
eb30: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
eb40: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
eb50: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
eb60: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
eb70: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
eb80: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
eb90: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
eba0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
ebb0: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
ebc0: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
ebd0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
ebe0: 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72  nAllField and ar
ebf0: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
ec00: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
ec10: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
ec20: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
ec30: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
ec40: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
ec50: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
ec60: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
ec70: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
ec80: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
ec90: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
eca0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   KEY columns..**
ecb0: 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20  .** For virtual 
ecc0: 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29  tables, only (1)
ecd0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
ece0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
ecf0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
ed00: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
ed10: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
ed20: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
ed30: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
ed40: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
ed50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
ed60: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ed70: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
ed80: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
ed90: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
eda0: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
edb0: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
edc0: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
edd0: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
ede0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
edf0: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
ee00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
ee10: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
ee20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
ee30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
ee40: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
ee50: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
ee60: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
ee70: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
ee80: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
ee90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
eea0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
eeb0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
eec0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
eed0: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
eee0: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
eef0: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
ef00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
ef10: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
ef20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
ef30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ef40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
ef50: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
ef60: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
ef70: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
ef80: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ef90: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
efa0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
efb0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
efc0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
efd0: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
efe0: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
eff0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
f000: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
f010: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
f020: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
f030: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
f040: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
f050: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
f060: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
f070: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
f080: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
f090: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
f0a0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
f0b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
f0c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
f0d0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
f0e0: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
f0f0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f100: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
f110: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
f120: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
f130: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
f140: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
f150: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
f160: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
f170: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
f180: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
f190: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
f1a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
f1d0: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
f1e0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
f1f0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
f200: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
f210: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
f220: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
f230: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
f240: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
f250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f260: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
f270: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
f280: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f290: 50 6b 21 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  Pk!=0 );..    /*
f2a0: 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61  .    ** Remove a
f2b0: 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  ll redundant col
f2c0: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52  umns from the PR
f2d0: 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20  IMARY KEY.  For 
f2e0: 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a  example, change.
f2f0: 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20      ** "PRIMARY 
f300: 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c  KEY(a,b,a,b,c,b,
f310: 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20  c,d)" into just 
f320: 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62  "PRIMARY KEY(a,b
f330: 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20  ,c,d)".  Later. 
f340: 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d     ** code assum
f350: 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  es the PRIMARY K
f360: 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  EY contains no r
f370: 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  epeated columns.
f380: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
f390: 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b  i=j=1; i<pPk->nK
f3a0: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
f3b0: 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
f3c0: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
f3d0: 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  j, pPk->aiColumn
f3e0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f3f0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a  pPk->nColumn--;.
f400: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f410: 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75       pPk->aiColu
f420: 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61  mn[j++] = pPk->a
f430: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
f440: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
f450: 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a  k->nKeyCol = j;.
f460: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
f470: 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69  k!=0 );.  pPk->i
f480: 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
f490: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69   if( !db->init.i
f4a0: 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20 70  mposterTable ) p
f4b0: 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  Pk->uniqNotNull 
f4c0: 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  = 1;.  nPk = pPk
f4d0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
f4e0: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
f4f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  tion of the PRIM
f500: 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e  ARY KEY btree an
f510: 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  d the sqlite_mas
f520: 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65  ter.  ** table e
f530: 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e  ntry. This is on
f540: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63  ly required if c
f550: 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74  urrently generat
f560: 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f  ing VDBE.  ** co
f570: 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  de for a CREATE 
f580: 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20  TABLE (not when 
f590: 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70  parsing one as p
f5a0: 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20  art of reading. 
f5b0: 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73   ** a database s
f5c0: 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66  chema).  */.  if
f5d0: 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d  ( v && pPk->tnum
f5e0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
f5f0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
f600: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
f610: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
f620: 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20  e(v, pPk->tnum, 
f630: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20  OP_Goto);.  }.. 
f640: 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
f650: 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  e of the PRIMARY
f660: 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c   KEY is the tabl
f670: 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20  e root page */. 
f680: 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61   pPk->tnum = pTa
f690: 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55  b->tnum;..  /* U
f6a0: 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  pdate the in-mem
f6b0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
f6c0: 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45  on of all UNIQUE
f6d0: 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76   indices by conv
f6e0: 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  erting.  ** the 
f6f0: 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75  final rowid colu
f700: 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  mn into one or m
f710: 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
f720: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  he PRIMARY KEY..
f730: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
f740: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f750: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f760: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
f770: 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d  ;.    if( IsPrim
f780: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
f790: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
f7a0: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e    for(i=n=0; i<n
f7b0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
f7c0: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
f7d0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
f7e0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
f7f0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
f800: 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) n++;.    }.   
f810: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f820: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
f830: 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f   is a superset o
f840: 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
f850: 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d  y */.      pIdx-
f860: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d  >nColumn = pIdx-
f870: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
f880: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
f890: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
f8a0: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49  dexObject(db, pI
f8b0: 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  dx, pIdx->nKeyCo
f8c0: 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l+n) ) return;. 
f8d0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49     for(i=0, j=pI
f8e0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e  dx->nKeyCol; i<n
f8f0: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
f900: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
f910: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
f920: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
f930: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
f940: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
f950: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70  >aiColumn[j] = p
f960: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
f970: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
f980: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  zColl[j] = pPk->
f990: 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
f9a0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
f9b0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f9c0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
f9d0: 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e  =pIdx->nKeyCol+n
f9e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f9f0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a  pIdx->nColumn>=j
fa00: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64   );.  }..  /* Ad
fa10: 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75  d all table colu
fa20: 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41  mns to the PRIMA
fa30: 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a  RY KEY index.  *
fa40: 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62  /.  if( nPk<pTab
fa50: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66  ->nCol ){.    if
fa60: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
fa70: 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61  ect(db, pPk, pTa
fa80: 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72  b->nCol) ) retur
fa90: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
faa0: 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e  j=nPk; i<pTab->n
fab0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
fac0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
fad0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
fae0: 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , i) ){.        
faf0: 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e  assert( j<pPk->n
fb00: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
fb10: 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b    pPk->aiColumn[
fb20: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
fb30: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  pPk->azColl[j] =
fb40: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
fb50: 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  Y;.        j++;.
fb60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fb70: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
fb80: 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20  Column==j );.   
fb90: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
fba0: 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73  Col==j );.  }els
fbb0: 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c  e{.    pPk->nCol
fbc0: 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  umn = pTab->nCol
fbd0: 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70 75 74  ;.  }.  recomput
fbe0: 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78  eColumnsNotIndex
fbf0: 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 23 69 66 6e  ed(pPk);.}..#ifn
fc00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fc10: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
fc20: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
fc30: 66 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68 61  f zName is a sha
fc40: 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  dow table name i
fc50: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
fc60: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
fc70: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d  tion..**.** zNam
fc80: 65 20 69 73 20 74 65 6d 70 6f 72 61 72 69 6c 79  e is temporarily
fc90: 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
fca0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fcb0: 72 75 6e 6e 69 6e 67 2c 20 62 75 74 20 69 73 0a  running, but is.
fcc0: 2a 2a 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  ** restored to i
fcd0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75  ts original valu
fce0: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  e prior to this 
fcf0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 69 6e  routine returnin
fd00: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
fd10: 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61   isShadowTableNa
fd20: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
fd30: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
fd40: 63 68 61 72 20 2a 7a 54 61 69 6c 3b 20 20 20 20  char *zTail;    
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
fd70: 6c 61 73 74 20 22 5f 22 20 69 6e 20 7a 4e 61 6d  last "_" in zNam
fd80: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
fd90: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
fda0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68       /* Table th
fdb0: 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68  at zName is a sh
fdc0: 61 64 6f 77 20 6f 66 20 2a 2f 0a 20 20 4d 6f 64  adow of */.  Mod
fdd0: 75 6c 65 20 2a 70 4d 6f 64 3b 20 20 20 20 20 20  ule *pMod;      
fde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
fdf0: 64 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69 72  dule for the vir
fe00: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  tual table */.. 
fe10: 20 7a 54 61 69 6c 20 3d 20 73 74 72 72 63 68 72   zTail = strrchr
fe20: 28 7a 4e 61 6d 65 2c 20 27 5f 27 29 3b 0a 20 20  (zName, '_');.  
fe30: 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72  if( zTail==0 ) r
fe40: 65 74 75 72 6e 20 30 3b 0a 20 20 2a 7a 54 61 69  eturn 0;.  *zTai
fe50: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 20 3d 20  l = 0;.  pTab = 
fe60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
fe70: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  (db, zName, 0);.
fe80: 20 20 2a 7a 54 61 69 6c 20 3d 20 27 5f 27 3b 0a    *zTail = '_';.
fe90: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
fea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
feb0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
fec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
fed0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73  Mod = (Module*)s
fee0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
fef0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 70 54 61  db->aModule, pTa
ff00: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
ff10: 5d 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 3d 3d  ]);.  if( pMod==
ff20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ff30: 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  if( pMod->pModul
ff40: 65 2d 3e 69 56 65 72 73 69 6f 6e 3c 33 20 29 20  e->iVersion<3 ) 
ff50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
ff60: 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  pMod->pModule->x
ff70: 53 68 61 64 6f 77 4e 61 6d 65 3d 3d 30 20 29 20  ShadowName==0 ) 
ff80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
ff90: 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65  rn pMod->pModule
ffa0: 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 28 7a 54  ->xShadowName(zT
ffb0: 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65 6c 73 65 0a  ail+1);.}.#else.
ffc0: 23 20 64 65 66 69 6e 65 20 69 73 53 68 61 64 6f  # define isShado
ffd0: 77 54 61 62 6c 65 4e 61 6d 65 28 78 2c 79 29 20  wTableName(x,y) 
ffe0: 30 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  0.#endif /* ifnd
fff0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10000 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
10010 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10020 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10030 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
10040 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
10050 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
10060 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
10070 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
10080 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
10090 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
100a0 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
100b0 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
100c0 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
100d0 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
100e0 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
100f0 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
10100 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
10110 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
10120 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
10130 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
10140 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
10150 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
10160 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
10170 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
10180 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
10190 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
101a0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
101b0 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
101c0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
101d0 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
101e0 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
101f0 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
10200 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
10210 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
10220 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
10230 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
10240 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
10250 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
10260 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
10270 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
10280 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
10290 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
102a0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
102b0 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
102c0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
102d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
102e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
102f0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
10300 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
10310 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
10320 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
10330 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
10340 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
10350 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
10360 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
10370 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
10380 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
10390 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
103a0 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
103b0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
103c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
103d0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
103e0 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
103f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10400 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
10410 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
10420 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
10430 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
10440 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
10450 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
10460 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
10470 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
10480 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
10490 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
104a0 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
104b0 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
104c0 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
104d0 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
104e0 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
104f0 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
10500 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
10510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10520 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
10530 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10540 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
10550 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10560 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
10570 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
10580 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10590 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
105a0 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
105b0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
105c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
105d0 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
105e0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
105f0 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  f( pEnd==0 && pS
10600 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
10610 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
10620 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
10630 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d  cFailed );.  p =
10640 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10650 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
10660 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
10670 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69 73  pSelect==0 && is
10680 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
10690 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b  db, p->zName) ){
106a0 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  .    p->tabFlags
106b0 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a 20   |= TF_Shadow;. 
106c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
106d0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
106e0 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
106f0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
10700 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
10710 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
10720 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
10730 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
10740 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
10750 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
10760 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
10770 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
10780 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
10790 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
107a0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
107b0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
107c0 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
107d0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
107e0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
107f0 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
10800 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
10810 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne.).  **.  ** I
10820 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
10830 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61  number is 1, tha
10840 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20  t means this is 
10850 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
10860 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73  r.  ** table its
10870 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74  elf.  So mark it
10880 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f   read-only..  */
10890 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
108a0 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20  busy ){.    if( 
108b0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
108c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
108d0 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20 20  (pParse, "");.  
108e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
108f0 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
10900 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
10910 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75  ;.    if( p->tnu
10920 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61  m==1 ) p->tabFla
10930 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c  gs |= TF_Readonl
10940 79 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  y;.  }..  assert
10950 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
10960 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
10970 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  y)==0.       || 
10980 70 2d 3e 69 50 4b 65 79 3e 3d 30 20 7c 7c 20 73  p->iPKey>=0 || s
10990 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
109a0 49 6e 64 65 78 28 70 29 21 3d 30 20 29 3b 0a 20  Index(p)!=0 );. 
109b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62   assert( (p->tab
109c0 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
109d0 69 6d 61 72 79 4b 65 79 29 21 3d 30 0a 20 20 20  imaryKey)!=0.   
109e0 20 20 20 20 7c 7c 20 28 70 2d 3e 69 50 4b 65 79      || (p->iPKey
109f0 3c 30 20 26 26 20 73 71 6c 69 74 65 33 50 72 69  <0 && sqlite3Pri
10a00 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3d  maryKeyIndex(p)=
10a10 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  =0) );..  /* Spe
10a20 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
10a30 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
10a40 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
10a50 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
10a60 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
10a70 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
10a80 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10a90 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
10aa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10ab0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10ac0 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
10ad0 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
10ae0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
10af0 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
10b00 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
10b10 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
10b20 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
10b30 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
10b40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10b50 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
10b60 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
10b70 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
10b80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
10b90 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46  e{.      p->tabF
10ba0 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f  lags |= TF_Witho
10bb0 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
10bc0 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
10bd0 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68     convertToWith
10be0 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50  outRowidTable(pP
10bf0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
10c00 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c    }..  iDb = sql
10c10 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10c20 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
10c30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
10c40 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
10c50 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
10c60 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
10c70 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
10c80 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
10c90 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
10ca0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
10cb0 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
10cc0 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68  arse, p, NC_IsCh
10cd0 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63  eck, 0, p->pChec
10ce0 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  k);.  }.#endif /
10cf0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
10d00 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
10d10 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
10d20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20  the average row 
10d30 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62  size for the tab
10d40 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
10d50 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a  mplied indices *
10d60 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c  /.  estimateTabl
10d70 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72  eWidth(p);.  for
10d80 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
10d90 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
10da0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73  ->pNext){.    es
10db0 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
10dc0 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
10dd0 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
10de0 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
10df0 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
10e00 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
10e10 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
10e20 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
10e30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
10e40 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
10e50 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
10e60 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
10e70 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
10e80 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
10e90 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
10ea0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
10eb0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
10ec0 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
10ed0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
10ee0 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
10ef0 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
10f00 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
10f10 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
10f20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
10f30 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
10f40 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
10f50 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
10f60 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
10f70 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
10f80 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
10f90 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
10fa0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10fb0 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
10fc0 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
10fd0 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
10fe0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10ff0 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20  _Close, 0);..   
11000 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74   /* .    ** Init
11010 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72  ialize zType for
11020 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72   the new view or
11030 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
11040 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
11050 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
11060 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
11070 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
11080 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
11090 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
110a0 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
110b0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
110c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
110d0 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
110e0 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
110f0 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
11100 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
11110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11120 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
11130 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
11140 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
11150 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
11160 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
11170 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
11180 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
11190 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
111a0 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
111b0 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73  able is in regis
111c0 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
111d0 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oot..    **.    
111e0 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
111f0 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
11200 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
11210 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
11220 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
11230 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
11240 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
11250 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
11260 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
11270 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
11280 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
11290 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
112a0 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
112b0 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
112c0 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
112d0 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
112e0 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
112f0 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
11300 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
11310 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
11320 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
11330 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
11340 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
11350 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
11360 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
11370 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
11380 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
11390 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
113a0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
113b0 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  est;    /* Where
113c0 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75   the SELECT shou
113d0 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73  ld store results
113e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
113f0 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  gYield;       /*
11400 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
11410 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74  g co-routine ent
11420 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ry-point */.    
11430 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
11440 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
11450 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  the co-routine *
11460 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
11470 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ec;         /* A
11480 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
11490 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  sert into the ne
114a0 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  w table */.     
114b0 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
114c0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
114d0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f   the next row to
114e0 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20   insert */.     
114f0 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70   int addrInsLoop
11500 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  ;    /* Top of t
11510 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65  he loop for inse
11520 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rting rows */.  
11530 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
11540 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62  ab;     /* A tab
11550 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  le that describe
11560 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  s the SELECT res
11570 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ults */..      r
11580 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72  egYield = ++pPar
11590 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
115a0 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73  regRec = ++pPars
115b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
115c0 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
115d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
115e0 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
115f0 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
11600 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
11610 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
11620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11630 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
11640 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
11650 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
11660 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11670 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
11680 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
11690 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
116a0 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
116b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
116c0 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
116d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
116e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
116f0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
11700 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f  Yield, 0, addrTo
11710 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  p);.      if( pP
11720 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
11730 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  urn;.      pSelT
11740 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
11750 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
11760 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
11770 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
11780 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
11790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
117a0 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
117b0 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
117c0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
117d0 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
117e0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
117f0 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
11800 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
11810 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
11820 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
11830 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
11840 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
11850 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
11860 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
11870 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ne, regYield);. 
11880 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
11890 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
118a0 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ct, &dest);.    
118b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
118c0 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
118d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
118e0 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
118f0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
11900 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11910 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20  re(v, addrTop - 
11920 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e  1);.      addrIn
11930 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  sLoop = sqlite3V
11940 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11950 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50  Yield, dest.iSDP
11960 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65  arm);.      Vdbe
11970 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
11980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11990 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
119a0 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73  ecord, dest.iSds
119b0 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72  t, dest.nSdst, r
119c0 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71  egRec);.      sq
119d0 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69  lite3TableAffini
119e0 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ty(v, p, 0);.   
119f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11a00 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
11a10 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  wid, 1, regRowid
11a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11a30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11a40 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52  _Insert, 1, regR
11a50 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ec, regRowid);. 
11a60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11a70 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c  Goto(v, addrInsL
11a80 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
11a90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11aa0 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b  v, addrInsLoop);
11ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11ac0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
11ad0 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  lose, 1);.    }.
11ae0 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
11af0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
11b00 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
11b10 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
11b20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
11b30 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
11b40 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62  eateTableStmt(db
11b50 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
11b60 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45  .      Token *pE
11b70 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20  nd2 = tabOpts ? 
11b80 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  &pParse->sLastTo
11b90 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20  ken : pEnd;.    
11ba0 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64    n = (int)(pEnd
11bb0 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  2->z - pParse->s
11bc0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
11bd0 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a      if( pEnd2->z
11be0 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20  [0]!=';' ) n += 
11bf0 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20  pEnd2->n;.      
11c00 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
11c10 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
11c20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
11c30 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
11c40 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
11c50 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
11c60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
11c70 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
11c80 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
11c90 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
11ca0 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
11cb0 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
11cc0 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
11cd0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
11ce0 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
11cf0 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
11d00 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
11d10 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
11d20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
11d30 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
11d40 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
11d50 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
11d60 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
11d70 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
11d80 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
11d90 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
11da0 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
11db0 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
11dc0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
11dd0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
11de0 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
11df0 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
11e00 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
11e10 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
11e20 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
11e30 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
11e40 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
11e50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11e60 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
11e70 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
11e80 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
11e90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ea0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
11eb0 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
11ec0 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
11ed0 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
11ee0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
11ef0 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
11f00 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
11f10 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
11f20 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
11f30 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
11f40 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
11f50 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ent)!=0 ){.     
11f60 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
11f70 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
11f80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11f90 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11fa0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
11fb0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
11fc0 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
11fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11fe0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
11ff0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12000 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
12010 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
12020 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
12030 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62          pDb->zDb
12040 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  SName.        );
12050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
12060 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
12070 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
12080 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
12090 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
120a0 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
120b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
120c0 73 65 53 63 68 65 6d 61 4f 70 28 70 50 61 72 73  seSchemaOp(pPars
120d0 65 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  e, iDb,.        
120e0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
120f0 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
12100 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27  '%q' AND type!='
12110 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e  trigger'", p->zN
12120 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
12130 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
12140 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
12150 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
12160 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
12170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12180 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
12190 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
121a0 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
121b0 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
121c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
121d0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
121e0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
121f0 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
12200 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
12210 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
12220 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a  , p->zName, p);.
12230 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
12240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
12250 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
12260 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
12270 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
12280 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
12290 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
122a0 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
122b0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
122c0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
122d0 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6d 44   = 0;.    db->mD
122e0 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
122f0 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 0a  _SchemaChange;..
12300 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12310 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
12320 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
12330 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
12340 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
12350 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
12360 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
12370 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
12380 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
12390 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
123a0 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
123b0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
123c0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
123d0 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
123e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
123f0 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
12400 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
12410 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
12420 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
12430 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
12440 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
12450 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
12460 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
12470 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12480 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
12490 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
124a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
124b0 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
124c0 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
124d0 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
124e0 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
124f0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
12500 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
12510 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
12520 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
12530 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
12540 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
12550 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
12560 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
12570 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
12580 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
12590 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
125a0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
125b0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
125c0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
125d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
125e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
125f0 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69  pCNames, /* Opti
12600 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65  onal list of vie
12610 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  w column names *
12620 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
12630 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
12640 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
12650 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
12660 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
12670 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
12680 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
12690 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
126a0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
126b0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
126c0 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
126d0 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
126e0 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
126f0 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
12700 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
12710 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
12720 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
12730 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
12740 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44  me = 0;.  int iD
12750 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
12760 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
12770 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
12780 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
12790 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
127a0 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
127b0 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
127c0 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
127d0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
127e0 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  _fail;.  }.  sql
127f0 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
12800 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
12810 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
12820 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
12830 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
12840 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
12850 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
12860 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76   ) goto create_v
12870 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69  iew_fail;.  sqli
12880 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
12890 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
128a0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
128b0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
128c0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
128d0 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
128e0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
128f0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
12900 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
12910 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
12920 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
12930 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f   pSelect) ) goto
12940 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
12950 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  l;..  /* Make a 
12960 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
12970 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
12980 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
12990 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
129a0 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
129b0 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
129c0 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
129d0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
129e0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
129f0 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
12a00 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
12a10 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
12a20 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
12a30 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
12a40 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
12a50 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
12a60 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
12a70 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
12a80 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70  _OBJECT ){.    p
12a90 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ->pSelect = pSel
12aa0 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  ect;.    pSelect
12ab0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12ac0 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
12ad0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
12ae0 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
12af0 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
12b00 20 7d 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d   }.  p->pCheck =
12b10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12b20 44 75 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c  Dup(db, pCNames,
12b30 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
12b40 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
12b50 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
12b60 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
12b70 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
12b80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
12b90 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
12ba0 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
12bb0 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
12bc0 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
12bd0 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
12be0 73 74 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72  stToken;.  asser
12bf0 74 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  t( sEnd.z[0]!=0 
12c00 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a  || sEnd.n==0 );.
12c10 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
12c20 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
12c30 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
12c40 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
12c50 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64    n = (int)(sEnd
12c60 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b  .z - pBegin->z);
12c70 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
12c80 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
12c90 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  z;.  while( sqli
12ca0 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31  te3Isspace(z[n-1
12cb0 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  ]) ){ n--; }.  s
12cc0 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
12cd0 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
12ce0 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
12cf0 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
12d00 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
12d10 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
12d20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
12d30 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
12d40 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20  e, 0, &sEnd, 0, 
12d50 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77  0);..create_view
12d60 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33  _fail:.  sqlite3
12d70 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
12d80 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
12d90 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
12da0 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
12db0 52 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e  RenameExprlistUn
12dc0 6d 61 70 28 70 50 61 72 73 65 2c 20 70 43 4e 61  map(pParse, pCNa
12dd0 6d 65 73 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mes);.  }.  sqli
12de0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
12df0 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  e(db, pCNames);.
12e00 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
12e10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12e20 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
12e30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12e40 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
12e50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12e60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
12e70 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
12e80 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
12e90 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
12ea0 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
12eb0 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
12ec0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
12ed0 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
12ee0 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
12ef0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
12f00 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
12f10 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
12f20 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
12f30 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
12f40 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
12f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
12f60 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
12f70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12f80 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
12f90 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
12fa0 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
12fb0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
12fc0 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
12fd0 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
12fe0 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
12ff0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
13000 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
13010 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
13020 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
13030 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
13040 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
13050 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
13060 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
13070 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
13080 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
13090 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
130a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
130b0 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
130c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
130d0 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
130e0 6f 72 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ors */.#ifndef S
130f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13100 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 72 63  ALTABLE.  int rc
13110 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ;.#endif.#ifndef
13120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13130 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c  HORIZATION.  sql
13140 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68  ite3_xauth xAuth
13150 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
13160 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a   xAuth pointer *
13170 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
13180 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
13190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
131a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
131b0 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
131c0 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  k++;.  rc = sqli
131d0 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
131e0 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
131f0 65 29 3b 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  e);.  db->nSchem
13200 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69 66 28 20 72  aLock--;.  if( r
13210 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
13220 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  1;.  }.  if( IsV
13230 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
13240 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
13250 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
13260 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
13270 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
13280 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
13290 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
132a0 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
132b0 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
132c0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
132d0 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
132e0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
132f0 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
13300 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
13310 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
13320 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
13330 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
13340 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
13350 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
13360 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
13370 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
13380 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
13390 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
133a0 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
133b0 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
133c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
133d0 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
133e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
133f0 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
13400 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
13410 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
13420 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
13430 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
13440 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
13450 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
13460 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
13470 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
13480 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
13490 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
134a0 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
134b0 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
134c0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
134d0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
134e0 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
134f0 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
13500 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
13510 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
13520 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
13530 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
13540 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
13550 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
13560 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13570 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13580 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
13590 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
135a0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
135b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
135c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
135d0 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
135e0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
135f0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
13600 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
13610 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
13620 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
13630 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
13640 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
13650 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
13660 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
13670 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
13680 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
13690 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
136a0 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
136b0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
136c0 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
136d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
136e0 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
136f0 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
13700 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
13710 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
13720 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
13730 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
13740 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
13750 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13760 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
13770 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13780 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
13790 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
137a0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
137b0 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
137c0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  t, 0);.  if( pSe
137d0 6c 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l ){.#ifndef SQL
137e0 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
137f0 42 4c 45 0a 20 20 20 20 75 38 20 65 50 61 72 73  BLE.    u8 ePars
13800 65 4d 6f 64 65 20 3d 20 70 50 61 72 73 65 2d 3e  eMode = pParse->
13810 65 50 61 72 73 65 4d 6f 64 65 3b 0a 20 20 20 20  eParseMode;.    
13820 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f  pParse->eParseMo
13830 64 65 20 3d 20 50 41 52 53 45 5f 4d 4f 44 45 5f  de = PARSE_MODE_
13840 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  NORMAL;.#endif. 
13850 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
13860 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
13870 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
13880 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
13890 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
138a0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
138b0 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
138c0 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 23  de.bDisable++;.#
138d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
138e0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
138f0 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
13900 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
13910 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
13920 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
13930 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
13940 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
13950 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
13960 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
13970 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
13980 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
13990 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
139a0 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  l);.#endif.    p
139b0 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
139c0 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d  .    if( pTable-
139d0 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  >pCheck ){.     
139e0 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
139f0 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53  name(arglist) AS
13a00 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68   ....      ** Th
13a10 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
13a20 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
13a30 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ble are taken fr
13a40 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c  om.      ** argl
13a50 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f  ist which is sto
13a60 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70  red in pTable->p
13a70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65  Check.  The pChe
13a80 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a  ck field.      *
13a90 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73  * normally holds
13aa0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
13ab0 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72  ts on an ordinar
13ac0 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72  y table, but for
13ad0 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57  .      ** a VIEW
13ae0 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69   it holds the li
13af0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  st of column nam
13b00 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
13b10 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
13b20 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
13b30 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43  arse, pTable->pC
13b40 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  heck, .         
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b60 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d          &pTable-
13b70 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e  >nCol, &pTable->
13b80 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  aCol);.      if(
13b90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13ba0 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  d==0 .       && 
13bb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a  pParse->nErr==0.
13bc0 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65         && pTable
13bd0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45  ->nCol==pSel->pE
13be0 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
13bf0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
13c00 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
13c10 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
13c20 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
13c30 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  le, pSel);.     
13c40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13c50 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
13c60 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57    /* CREATE VIEW
13c70 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74   name AS...  wit
13c80 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74  hout an argument
13c90 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63   list.  Construc
13ca0 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  t.      ** the c
13cb0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
13cc0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
13cd0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
13ce0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20  es the view..   
13cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
13d00 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
13d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
13d20 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
13d30 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
13d40 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
13d50 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
13d60 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
13d70 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
13d80 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
13d90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13da0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
13db0 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61  xHeld(db, 0, pTa
13dc0 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  ble->pSchema) );
13dd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13de0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13df0 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
13e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13e10 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
13e20 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
13e30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13e40 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a  lete(db, pSel);.
13e50 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
13e60 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 23 69  e.bDisable--;.#i
13e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13e80 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
13e90 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
13ea0 6f 64 65 20 3d 20 65 50 61 72 73 65 4d 6f 64 65  ode = eParseMode
13eb0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 20 65 6c 73  ;.#endif.  } els
13ec0 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
13ed0 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53    }.  pTable->pS
13ee0 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
13ef0 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
13f00 56 69 65 77 73 3b 0a 20 20 69 66 28 20 64 62 2d  Views;.  if( db-
13f10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13f20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
13f30 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
13f40 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , pTable);.    p
13f50 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
13f60 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
13f70 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  l = 0;.  }.#endi
13f80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13f90 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
13fa0 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
13fb0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
13fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
13fd0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
13fe0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13ff0 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
14000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14010 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
14020 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
14030 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
14040 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
14050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14060 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
14070 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
14080 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
14090 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65  hElem *i;.  asse
140a0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
140b0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
140c0 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  dx, 0) );.  if( 
140d0 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
140e0 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
140f0 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
14100 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
14110 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
14120 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
14130 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
14140 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
14150 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
14160 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
14170 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
14180 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
14190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
141a0 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
141b0 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
141c0 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
141d0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
141e0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
141f0 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
14200 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
14210 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
14220 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14230 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
14240 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
14250 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
14260 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
14270 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14280 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
14290 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
142a0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
142b0 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
142c0 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
142d0 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
142e0 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
142f0 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
14300 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
14310 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
14320 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
14330 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
14340 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
14350 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
14360 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
14370 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
14380 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
14390 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
143a0 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
143b0 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
143c0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
143d0 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
143e0 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
143f0 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
14400 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
14410 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
14420 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
14430 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
14440 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
14450 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
14460 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
14470 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
14480 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
14490 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
144a0 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
144b0 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
144c0 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
144d0 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
144e0 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
144f0 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
14500 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
14510 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
14520 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
14530 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
14540 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
14550 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
14560 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
14570 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
14580 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
14590 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
145a0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
145b0 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
145c0 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
145d0 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
145e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
145f0 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
14600 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
14610 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
14620 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
14630 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
14640 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
14650 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
14660 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
14670 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
14680 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
14690 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
146a0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
146b0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
146c0 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
146d0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
146e0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
146f0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
14700 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
14710 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
14720 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
14730 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
14740 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
14750 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
14760 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
14770 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
14780 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
14790 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
147a0 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
147b0 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
147c0 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
147d0 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
147e0 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
147f0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
14800 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
14810 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
14820 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
14830 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
14840 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
14850 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
14860 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
14870 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
14880 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
14890 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
148a0 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
148b0 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
148c0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
148d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
148e0 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
148f0 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
14900 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
14910 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
14920 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
14930 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
14940 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
14950 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
14960 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
14970 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
14980 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
14990 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
149a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
149b0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
149c0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
149d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
149e0 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
149f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14a00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14a10 69 66 28 20 69 54 61 62 6c 65 3c 32 20 29 20 73  if( iTable<2 ) s
14a20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14a30 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
14a40 73 63 68 65 6d 61 22 29 3b 0a 20 20 73 71 6c 69  schema");.  sqli
14a50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14a60 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
14a70 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
14a80 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
14a90 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
14aa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14ab0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
14ac0 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
14ad0 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
14ae0 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
14af0 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
14b00 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
14b10 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
14b20 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
14b30 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
14b40 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
14b50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
14b60 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
14b70 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
14b80 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
14b90 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
14ba0 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
14bb0 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
14bc0 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
14bd0 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
14be0 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
14bf0 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
14c00 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
14c10 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
14c20 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
14c30 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
14c40 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
14c50 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
14c60 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
14c70 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
14c80 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
14c90 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
14ca0 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
14cb0 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
14cc0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
14cd0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
14ce0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69  , MASTER_NAME, i
14cf0 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
14d00 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
14d10 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
14d20 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
14d30 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
14d40 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
14d50 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
14d60 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
14d70 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
14d80 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
14d90 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
14da0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
14db0 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
14dc0 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
14dd0 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
14de0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
14df0 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
14e00 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
14e10 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
14e20 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
14e30 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
14e40 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
14e50 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
14e60 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
14e70 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
14e80 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
14e90 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
14ea0 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
14eb0 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
14ec0 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
14ed0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
14ee0 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
14ef0 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
14f00 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
14f10 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
14f20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
14f30 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
14f40 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
14f50 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
14f60 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
14f70 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
14f80 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
14f90 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
14fa0 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
14fb0 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
14fc0 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
14fd0 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
14fe0 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
14ff0 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
15000 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
15010 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
15020 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
15030 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
15040 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
15050 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
15060 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
15070 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
15080 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
15090 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
150a0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
150b0 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
150c0 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
150d0 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
150e0 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
150f0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
15100 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
15110 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
15120 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
15130 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
15140 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
15150 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
15160 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
15170 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
15180 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
15190 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
151a0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
151b0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
151c0 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
151d0 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
151e0 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
151f0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
15200 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
15210 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
15220 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
15230 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
15240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
15250 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
15260 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
15270 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
15280 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
15290 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
152a0 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
152b0 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
152c0 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
152d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
152e0 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
152f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
15300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
15310 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
15320 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
15330 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
15340 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73  chema);.      as
15350 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
15360 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e  iDb<pParse->db->
15370 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73  nDb );.      des
15380 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
15390 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
153a0 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
153b0 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
153c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
153d0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
153e0 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
153f0 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
15400 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
15410 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
15420 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
15430 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
15440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15450 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
15460 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
15470 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15480 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
15490 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
154a0 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
154b0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
154c0 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
154d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
154e0 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
154f0 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
15500 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
15510 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15520 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
15530 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
15540 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
15550 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
15560 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
15570 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
15580 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
15590 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
155a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
155b0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
155c0 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
155d0 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
155e0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
155f0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
15600 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
15610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
15620 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
15630 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
15640 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
15650 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
15660 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
15670 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
15680 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
15690 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
156a0 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
156b0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
156c0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
156d0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
156e0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
156f0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
15700 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
15710 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
15720 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
15730 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
15740 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
15750 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
15760 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
15770 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15780 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
15790 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
157a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
157b0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
157c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
157d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
157e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
157f0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
15800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
15810 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
15820 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15830 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
15840 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
15850 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
15860 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
15870 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
15880 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
15890 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
158a0 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
158b0 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
158c0 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
158d0 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
158e0 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
158f0 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
15900 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
15910 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
15920 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
15930 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
15940 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
15950 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
15960 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
15970 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
15980 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
15990 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
159a0 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
159b0 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
159c0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
159d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
159e0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
159f0 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
15a00 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
15a10 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
15a20 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
15a30 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
15a40 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
15a50 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
15a60 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
15a70 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
15a80 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
15a90 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
15aa0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
15ab0 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
15ac0 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
15ad0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
15ae0 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
15af0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
15b00 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
15b10 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
15b20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
15b30 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
15b40 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
15b50 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
15b60 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
15b70 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
15b80 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
15b90 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20   pDb->zDbSName, 
15ba0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
15bb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
15bc0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
15bd0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
15be0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
15bf0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
15c00 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
15c10 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
15c20 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
15c30 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
15c40 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
15c50 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
15c60 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
15c70 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
15c80 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
15c90 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
15ca0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
15cb0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
15cc0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
15cd0 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
15ce0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
15cf0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
15d00 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
15d10 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
15d20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
15d30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
15d40 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15d50 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
15d60 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
15d70 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
15d80 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
15d90 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44  ",.      pDb->zD
15da0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
15db0 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  AME, pTab->zName
15dc0 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
15dd0 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
15de0 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
15df0 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
15e00 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
15e10 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
15e20 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
15e30 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
15e40 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
15e50 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
15e60 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
15e70 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
15e80 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
15e90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15ea0 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
15eb0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
15ec0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
15ed0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
15ee0 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
15ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15f00 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
15f10 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
15f20 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
15f30 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
15f40 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
15f50 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
15f60 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
15f70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15f80 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15f90 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
15fa0 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
15fb0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
15fc0 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
15fd0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
15fe0 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
15ff0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
16000 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
16010 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
16020 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
16030 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
16040 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
16050 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
16060 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
16070 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
16080 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
16090 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
160a0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
160b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
160c0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
160d0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
160e0 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
160f0 66 28 20 21 49 73 53 68 61 72 65 64 53 63 68 65  f( !IsSharedSche
16100 6d 61 28 64 62 29 20 26 26 20 73 71 6c 69 74 65  ma(db) && sqlite
16110 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
16120 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
16130 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66  drop_table;.  if
16140 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
16150 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61  ppressErr++;.  a
16160 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30  ssert( isView==0
16170 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41   || isView==LOCA
16180 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61  TE_VIEW );.  pTa
16190 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
161a0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
161b0 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d  e, isView, &pNam
161c0 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20  e->a[0]);.  if( 
161d0 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
161e0 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66  ressErr--;..  if
161f0 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
16200 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c   if( noErr ) sql
16210 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
16220 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
16230 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
16240 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f  atabase);.    go
16250 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
16260 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
16270 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
16280 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
16290 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
162a0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
162b0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 73 71  <db->nDb );.  sq
162c0 6c 69 74 65 33 53 63 68 65 6d 61 57 72 69 74 61  lite3SchemaWrita
162d0 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ble(pParse, iDb)
162e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20  ;..  /* If pTab 
162f0 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  is a virtual tab
16300 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74  le, call ViewGet
16310 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f  ColumnNames() to
16320 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20   ensure.  ** it 
16330 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  is initialized..
16340 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
16350 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71  tual(pTab) && sq
16360 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
16370 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
16380 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  pTab) ){.    got
16390 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
163a0 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  e;.  }.#ifndef S
163b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
163c0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
163d0 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
163e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
163f0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
16400 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
16410 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
16420 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
16430 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
16440 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
16450 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
16460 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
16470 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
16480 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
16490 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
164a0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
164b0 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
164c0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
164d0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
164e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
164f0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
16500 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
16510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16520 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
16530 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
16540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16550 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16560 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
16570 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
16580 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
16590 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
165a0 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
165b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
165c0 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  le(db, pTab)->pM
165d0 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
165e0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
165f0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
16600 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
16610 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
16620 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
16630 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
16640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
16650 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
16660 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
16670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
16680 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
16690 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
166a0 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
166b0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
166c0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
166d0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
166e0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
166f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
16700 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
16710 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
16720 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
16730 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
16740 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
16750 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
16760 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
16770 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
16780 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74  =0 .    && sqlit
16790 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
167a0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
167b0 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b  stat", 11)!=0 ){
167c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
167d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
167e0 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
167f0 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
16800 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
16810 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
16820 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
16830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
16840 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
16850 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
16860 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
16870 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
16880 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
16890 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
168a0 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
168b0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
168c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
168d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
168e0 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
168f0 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
16900 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
16910 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16920 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
16930 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
16940 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
16950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16960 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16970 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
16980 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
16990 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
169a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
169b0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
169c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
169d0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
169e0 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
169f0 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
16a00 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
16a10 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
16a20 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16a30 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
16a40 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
16a50 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
16a60 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
16a70 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
16a80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
16a90 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
16aa0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
16ab0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
16ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b  .      sqlite3Fk
16ad0 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
16ae0 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a  , pName, pTab);.
16af0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16b00 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70  3CodeDropTable(p
16b10 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62  Parse, pTab, iDb
16b20 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a  , isView);.  }..
16b30 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
16b40 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
16b50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
16b60 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
16b70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16b80 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
16b90 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
16ba0 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
16bb0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
16bc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
16bd0 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
16be0 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
16bf0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
16c00 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
16c10 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
16c20 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
16c30 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
16c40 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
16c50 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
16c60 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
16c70 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
16c80 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
16c90 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20  d to (a.k.a the 
16ca0 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e  "parent" table).
16cb0 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
16cc0 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20  st.** of tables 
16cd0 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54  in the parent pT
16ce0 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20  o table.  flags 
16cf0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
16d00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
16d10 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
16d20 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
16d30 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
16d40 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
16d50 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
16d60 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
16d70 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
16d80 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
16d90 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
16da0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
16db0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
16dc0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
16dd0 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
16de0 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
16df0 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
16e00 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
16e10 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
16e20 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
16e30 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
16e40 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
16e50 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
16e60 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
16e70 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
16e80 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
16e90 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
16ea0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
16eb0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16ec0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
16ed0 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
16ee0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
16ef0 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
16f00 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
16f10 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
16f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
16f30 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
16f40 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
16f50 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
16f60 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
16f70 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
16f80 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
16f90 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
16fa0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
16fb0 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
16fc0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16fd0 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
16fe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
16ff0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
17000 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
17010 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
17020 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
17030 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
17040 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
17050 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
17060 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
17070 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
17080 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
17090 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
170a0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
170b0 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
170c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
170d0 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
170e0 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
170f0 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
17100 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
17110 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
17120 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
17130 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17140 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
17150 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
17160 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
17170 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
17180 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
17190 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
171a0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
171b0 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
171c0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
171d0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
171e0 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
171f0 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
17200 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
17210 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
17220 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17230 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
17240 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
17250 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
17260 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
17270 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
17280 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
17290 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
172a0 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
172b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
172c0 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
172d0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
172e0 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
172f0 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
17300 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
17310 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
17320 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
17330 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
17340 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
17350 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
17360 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
17370 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
17380 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
17390 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
173a0 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
173b0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
173c0 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
173d0 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
173e0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
173f0 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
17400 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
17410 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
17420 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
17430 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
17440 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
17450 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28 20 49  zTo = z;.  if( I
17460 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
17470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
17480 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
17490 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70  rse, (void*)z, p
174a0 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  To);.  }.  memcp
174b0 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
174c0 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
174d0 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
174e0 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
174f0 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
17500 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
17510 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
17520 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
17530 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
17540 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
17550 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
17560 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
17570 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
17580 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
17590 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
175a0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
175b0 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
175c0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
175d0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
175e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
175f0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
17600 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
17610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17630 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
17640 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
17650 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17660 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
17670 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
17680 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
17690 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
176a0 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
176b0 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
176c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
176d0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
176e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 49 4e    }.      if( IN
176f0 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
17700 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17710 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
17720 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b 65 79  p(pParse, &pFKey
17730 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72 6f 6d  ->aCol[i], pFrom
17740 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
17750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17760 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
17770 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
17780 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
17790 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
177a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
177b0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
177c0 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
177d0 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
177e0 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45  .      if( IN_RE
177f0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
17800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
17810 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
17820 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43 6f 6c  Parse, z, pToCol
17830 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
17840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
17850 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
17860 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
17870 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
17880 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
17890 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
178a0 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
178b0 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
178c0 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
178d0 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
178e0 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
178f0 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
17900 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
17910 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
17920 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
17930 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
17940 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
17950 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
17960 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
17970 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
17980 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
17990 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
179a0 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
179b0 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
179c0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
179d0 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a  , (void *)pFKey.
179e0 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74    );.  if( pNext
179f0 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20  To==pFKey ){.   
17a00 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
17a10 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  (db);.    goto f
17a20 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
17a30 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
17a40 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
17a50 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
17a60 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
17a70 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
17a80 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
17a90 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
17aa0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
17ab0 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
17ac0 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
17ad0 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
17ae0 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
17af0 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
17b00 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
17b10 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
17b20 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
17b30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17b40 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
17b50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
17b60 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
17b70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
17b80 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
17b90 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
17ba0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17bb0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
17bc0 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
17bd0 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
17be0 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
17bf0 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
17c00 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
17c10 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
17c20 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
17c30 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
17c40 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
17c50 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
17c60 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
17c70 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
17c80 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
17c90 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
17ca0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
17cb0 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
17cc0 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
17cd0 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
17ce0 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
17cf0 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
17d00 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
17d10 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
17d20 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
17d30 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
17d40 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
17d50 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
17d60 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17d70 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
17d80 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
17d90 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
17da0 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
17db0 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
17dc0 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
17dd0 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
17de0 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
17df0 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
17e00 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
17e10 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
17e20 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
17e30 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
17e40 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
17e50 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
17e60 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
17e70 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
17e80 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
17e90 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
17ea0 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
17eb0 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
17ec0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
17ed0 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
17ee0 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
17ef0 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
17f00 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
17f10 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
17f20 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
17f30 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
17f40 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
17f50 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
17f60 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
17f70 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
17f80 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
17f90 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
17fa0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
17fb0 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
17fc0 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
17fd0 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
17fe0 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
17ff0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
18000 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
18010 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
18020 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
18030 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
18040 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
18050 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
18060 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
18070 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
18080 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
18090 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
180a0 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
180b0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
180c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
180d0 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
180e0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
180f0 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
18100 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
18110 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
18120 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
18130 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
18140 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18160 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
18170 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
18180 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
18190 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
181b0 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
181c0 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
181d0 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
181e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
181f0 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
18200 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
18210 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
18220 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
18230 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
18240 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
18250 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
18260 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
18270 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
18280 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
18290 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
182a0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
182b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
182c0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
182d0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
182e0 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
182f0 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
18300 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
18310 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
18320 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
18330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18340 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
18350 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
18360 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
18370 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
18380 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
18390 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
183a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
183b0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
183c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
183d0 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
183e0 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
183f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
18400 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
18410 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18420 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
18430 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
18440 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
18450 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
18460 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  SName ) ){.    r
18470 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
18480 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
18490 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
184a0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
184b0 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
184c0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
184d0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
184e0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
184f0 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
18500 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
18510 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
18520 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
18530 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
18540 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
18550 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
18560 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
18570 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
18580 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20  ex->tnum;.  }.  
18590 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
185a0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
185b0 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  rse, pIndex);.  
185c0 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
185d0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
185e0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
185f0 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Err );..  /* Ope
18600 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
18610 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
18620 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
18630 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
18640 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
18650 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
18660 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
18670 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65  Sorter, 0, pInde
18680 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61  x->nKeyCol, (cha
18690 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r*).            
186a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
186b0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c  eyInfoRef(pKey),
186c0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
186d0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62   /* Open the tab
186e0 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  le. Loop through
186f0 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
18700 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e   table, insertin
18710 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63  g index.  ** rec
18720 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f  ords into the so
18730 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  rter. */.  sqlit
18740 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
18750 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
18760 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
18770 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
18780 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18790 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
187a0 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  b, 0); VdbeCover
187b0 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63  age(v);.  regRec
187c0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
187d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
187e0 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57  .  sqlite3MultiW
187f0 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 0a 20  rite(pParse);.. 
18800 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
18810 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
18820 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52  pIndex,iTab,regR
18830 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64  ecord,0,&iPartId
18840 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73  xLabel,0,0);.  s
18850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18860 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
18870 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ert, iSorter, re
18880 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
18890 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64  te3ResolvePartId
188a0 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69  xLabel(pParse, i
188b0 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20  PartIdxLabel);. 
188c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
188d0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
188e0 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  Tab, addr1+1); V
188f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18900 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18910 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
18920 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
18930 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64  ge<0 ) sqlite3Vd
18940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18950 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29  lear, tnum, iDb)
18960 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18970 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
18980 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
18990 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
189b0 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
189c0 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
189d0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
189e0 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c   OPFLAG_BULKCSR|
189f0 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ((memRootPage>=0
18a00 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  )?OPFLAG_P2ISREG
18a10 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d  :0));..  addr1 =
18a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a30 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
18a40 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29  ort, iSorter, 0)
18a50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
18a60 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
18a70 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
18a80 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73  {.    int j2 = s
18a90 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
18aa0 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  , 1);.    addr2 
18ab0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18ac0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
18ad0 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
18ae0 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f  fyAbortable(v, O
18af0 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20 73 71  E_Abort);.    sq
18b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18b10 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  nt(v, OP_SorterC
18b20 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
18b30 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a   j2, regRecord,.
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
18b60 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
18b70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
18b80 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
18b90 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
18ba0 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78  OE_Abort, pIndex
18bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18bc0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32  beJumpHere(v, j2
18bd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18be0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
18bf0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
18c00 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18c10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18c20 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
18c30 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  rter, regRecord,
18c40 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
18c50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18c60 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29  P_SeekEnd, iIdx)
18c70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18c80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
18c90 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
18ca0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
18cb0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
18cc0 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
18cd0 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
18ce0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18cf0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
18d00 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
18d10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
18d20 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74  orterNext, iSort
18d30 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65  er, addr2); Vdbe
18d40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
18d50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
18d60 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
18d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18d80 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
18d90 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTab);.  sqlite3
18da0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18db0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20  _Close, iIdx);. 
18dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18dd0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
18de0 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  iSorter);.}../*.
18df0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70  ** Allocate heap
18e00 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61   space to hold a
18e10 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77  n Index object w
18e20 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73  ith nCol columns
18e30 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ..**.** Increase
18e40 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
18e50 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20  size to provide 
18e60 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61 20  an extra nExtra 
18e70 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79  bytes.** of 8-by
18e80 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65  te aligned space
18e90 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
18ea0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
18eb0 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rn a.** pointer 
18ec0 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73 70  to this extra sp
18ed0 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e  ace in *ppExtra.
18ee0 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
18ef0 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
18f00 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  bject(.  sqlite3
18f10 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
18f20 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
18f30 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43  tion */.  i16 nC
18f40 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
18f50 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
18f60 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
18f70 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
18f80 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
18f90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
18fa0 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70 61  tes of extra spa
18fb0 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20  ce to alloc */. 
18fc0 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20   char **ppExtra 
18fd0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18fe0 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22 20   to the "extra" 
18ff0 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e  space */.){.  In
19000 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
19010 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
19020 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
19030 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
19040 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
19050 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64  of space for Ind
19060 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61  ex object + arra
19070 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d  ys */..  nByte =
19080 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
19090 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
190a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
190b0 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
190c0 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
190d0 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
190e0 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ) +         /* I
190f0 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
19100 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
19110 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73  ND8(sizeof(LogEs
19120 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20  t)*(nCol+1) +   
19130 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
19140 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  LogEst   */.    
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
19160 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20  eof(i16)*nCol + 
19170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19180 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
19190 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
191a0 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
191b0 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ol);            
191c0 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
191d0 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71  rder */.  p = sq
191e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
191f0 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45  o(db, nByte + nE
19200 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29  xtra);.  if( p )
19210 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74  {.    char *pExt
19220 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b  ra = ((char*)p)+
19230 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e  ROUND8(sizeof(In
19240 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  dex));.    p->az
19250 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  Coll = (const ch
19260 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70 45 78  ar**)pExtra; pEx
19270 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  tra += ROUND8(si
19280 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
19290 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c  );.    p->aiRowL
192a0 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  ogEst = (LogEst*
192b0 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
192c0 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
192d0 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  )*(nCol+1);.    
192e0 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  p->aiColumn = (i
192f0 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20  16*)pExtra;     
19300 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    pExtra += size
19310 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20  of(i16)*nCol;.  
19320 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
19330 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20  = (u8*)pExtra;. 
19340 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20     p->nColumn = 
19350 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65  nCol;.    p->nKe
19360 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b  yCol = nCol - 1;
19370 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20  .    *ppExtra = 
19380 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79  ((char*)p) + nBy
19390 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
193a0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   p;.}../*.** Cre
193b0 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
193c0 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
193d0 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
193e0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
193f0 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
19400 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
19410 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
19420 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
19430 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
19440 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
19450 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
19460 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
19470 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
19480 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
19490 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
194a0 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
194b0 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
194c0 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
194d0 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
194e0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
194f0 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
19500 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
19510 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
19520 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
19530 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
19540 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
19550 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
19560 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
19570 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
19580 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
19590 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
195a0 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
195b0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
195c0 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
195d0 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
195e0 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
195f0 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
19600 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
19610 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
19620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
19630 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
19640 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
19650 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
19660 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
19670 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
19680 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
19690 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
196a0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
196b0 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
196c0 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
196d0 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
196e0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
196f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
19700 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
19710 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
19720 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
19730 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
19740 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
19750 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
19760 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
19770 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
19780 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
19790 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
197a0 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
197b0 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
197c0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
197d0 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
197e0 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
197f0 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
19800 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  ement */.  Expr 
19810 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a  *pPIWhere,    /*
19820 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
19830 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  r partial indice
19840 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
19850 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
19860 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
19870 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
19880 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
19890 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20   ifNotExist,    
198a0 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
198b0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
198c0 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64  xists */.  u8 id
198d0 78 54 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a  xType         /*
198e0 20 54 68 65 20 69 6e 64 65 78 20 74 79 70 65 20   The index type 
198f0 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
19900 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
19910 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
19920 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
19930 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
19940 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
19950 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
19960 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
19970 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19980 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
19990 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
199a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
199b0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
199c0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
199d0 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
199e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
199f0 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
19a00 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
19a10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
19a20 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
19a30 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
19a40 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
19a50 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
19a60 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
19a70 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
19a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19a90 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
19aa0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
19ab0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
19ac0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
19ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19ae0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
19af0 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
19b00 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
19b10 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
19b20 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
19b30 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
19b40 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
19b50 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
19b60 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
19b70 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
19b80 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
19b90 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
19ba0 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
19bb0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
19bc0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
19bd0 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Extra[] */.  int
19be0 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20   nExtraCol;     
19bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19c00 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
19c10 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
19c20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  */.  char *zExtr
19c30 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
19c40 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
19c50 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
19c60 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
19c70 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b   Index *pPk = 0;
19c80 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59        /* PRIMARY
19c90 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57   KEY index for W
19ca0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
19cb0 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  les */..  if( db
19cc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
19cd0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
19ce0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
19cf0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19d00 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43    }.  if( IN_DEC
19d10 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69 64 78  LARE_VTAB && idx
19d20 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
19d30 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20  TYPE_PRIMARYKEY 
19d40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
19d50 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19d60 20 7d 0a 20 20 69 66 28 20 21 49 73 53 68 61 72   }.  if( !IsShar
19d70 65 64 53 63 68 65 6d 61 28 64 62 29 20 26 26 20  edSchema(db) && 
19d80 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
19d90 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
19da0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
19db0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19dc0 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ex;.  }..  /*.  
19dd0 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c  ** Find the tabl
19de0 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
19df0 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e  indexed.  Return
19e00 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f   early if not fo
19e10 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  und..  */.  if( 
19e20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a  pTblName!=0 ){..
19e30 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74      /* Use the t
19e40 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61  wo-part index na
19e50 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
19e60 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
19e70 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66    ** to search f
19e80 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46  or the table. 'F
19e90 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ix' the table na
19ea0 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20  me to this db.  
19eb0 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b    ** before look
19ec0 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65  ing up the table
19ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19ee0 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70  ert( pName1 && p
19ef0 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62  Name2 );.    iDb
19f00 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
19f10 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
19f20 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
19f30 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  Name);.    if( i
19f40 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74  Db<0 ) goto exit
19f50 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19f60 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
19f70 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a   && pName->z );.
19f80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19f90 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
19fa0 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
19fb0 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
19fc0 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
19fd0 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
19fe0 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e  is a temp table.
19ff0 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
1a000 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44  database to 1. D
1a010 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20  o not do this.  
1a020 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69    ** if initiali
1a030 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  sing a database 
1a040 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20  schema..    */. 
1a050 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1a060 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70  .busy ){.      p
1a070 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
1a080 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
1a090 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
1a0a0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e      if( pName2->
1a0b0 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
1a0c0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
1a0d0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1a0e0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
1a0f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1a100 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1a110 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
1a120 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
1a130 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
1a140 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e);.    if( sqli
1a150 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73  te3FixSrcList(&s
1a160 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29  Fix, pTblName) )
1a170 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75  {.      /* Becau
1a180 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  se the parser co
1a190 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d  nstructs pTblNam
1a1a0 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  e from a single 
1a1b0 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20  identifier,.    
1a1c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53    ** sqlite3FixS
1a1d0 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72  rcList can never
1a1e0 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   fail. */.      
1a1f0 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d  assert(0);.    }
1a200 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
1a210 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
1a220 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70  em(pParse, 0, &p
1a230 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a  TblName->a[0]);.
1a240 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1a250 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
1a260 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  || pTab==0 );.  
1a270 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1a280 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a290 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
1a2a0 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44  iDb==1 && db->aD
1a2b0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d  b[iDb].pSchema!=
1a2c0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
1a2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1a2e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1a2f0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
1a300 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50  ot create a TEMP
1a310 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45   index on non-TE
1a320 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22  MP table \"%s\""
1a330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
1a340 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
1a350 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a360 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1a370 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
1a380 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73  (pTab) ) pPk = s
1a390 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
1a3a0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d  Index(pTab);.  }
1a3b0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1a3c0 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
1a3d0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1a3e0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
1a3f0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
1a400 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
1a410 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
1a420 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1a430 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1a440 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1a450 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1a460 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
1a470 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73  >aDb[iDb];..  as
1a480 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
1a490 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1a4a0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1a4b0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
1a4c0 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
1a4d0 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
1a4e0 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d  0 .       && db-
1a4f0 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69  >init.busy==0.#i
1a500 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
1a510 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20  THENTICATION.   
1a520 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73      && sqlite3Us
1a530 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62  erAuthTable(pTab
1a540 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64  ->zName)==0.#end
1a550 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a560 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41  _ALLOW_SQLITE_MA
1a570 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20 20  STER_INDEX.     
1a580 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
1a590 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
1a5a0 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d 30  [7],"master")!=0
1a5b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26  .#endif.       &
1a5c0 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
1a5d0 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
1a5e0 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
1a5f0 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69  !=0. ){.    sqli
1a600 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a610 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
1a620 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
1a630 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
1a640 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
1a650 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
1a660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a670 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
1a680 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
1a690 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1a6a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
1a6b0 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
1a6c0 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
1a6d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a6e0 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
1a6f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a700 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1a710 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
1a720 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
1a730 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a740 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20  Parse, "virtual 
1a750 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62  tables may not b
1a760 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
1a770 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a780 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
1a790 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  dif..  /*.  ** F
1a7a0 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
1a7b0 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
1a7c0 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
1a7d0 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
1a7e0 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
1a7f0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
1a800 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
1a810 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
1a820 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
1a830 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
1a840 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
1a850 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
1a860 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
1a870 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
1a880 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
1a890 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
1a8a0 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
1a8b0 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
1a8c0 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
1a8d0 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
1a8e0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1a8f0 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
1a900 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
1a910 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
1a920 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
1a930 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
1a940 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
1a950 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
1a960 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
1a970 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
1a980 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
1a990 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
1a9a0 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
1a9b0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
1a9c0 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
1a9d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1a9e0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
1a9f0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ame);.    if( zN
1aa00 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
1aa10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1aa20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1aa30 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  me->z!=0 );.    
1aa40 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1aa50 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
1aa60 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
1aa70 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ame) ){.      go
1aa80 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1aa90 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1aaa0 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1aab0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69  BJECT ){.      i
1aac0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
1aad0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  y ){.        if(
1aae0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1aaf0 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
1ab00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ab10 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ab20 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
1ab30 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
1ab40 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
1ab50 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
1ab60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1ab70 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d  index;.        }
1ab80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ab90 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
1aba0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
1abb0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30  Db->zDbSName)!=0
1abc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1abd0 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20  !ifNotExist ){. 
1abe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1abf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ac00 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
1ac10 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
1ac20 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
1ac30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
1ac40 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
1ac50 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  usy );.         
1ac60 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1ac70 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
1ac80 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 7d   iDb);.        }
1ac90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
1aca0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1acb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1acc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1acd0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
1ace0 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
1acf0 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
1ad00 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
1ad10 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
1ad20 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
1ad30 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1ad40 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
1ad50 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
1ad60 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
1ad70 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
1ad80 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
1ad90 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1ada0 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ex;.    }..    /
1adb0 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
1adc0 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65  x names generate
1add0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71  d from within sq
1ade0 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
1adf0 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74  ab().    ** must
1ae00 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74   have names that
1ae10 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72   are distinct fr
1ae20 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61  om normal automa
1ae30 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e  tic index names.
1ae40 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
1ae50 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20  owing statement 
1ae60 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65  converts "sqlite
1ae70 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20  3_autoindex..." 
1ae80 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c  into.    ** "sql
1ae90 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e  ite3_butoindex..
1aea0 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ." in order to m
1aeb0 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69  ake the names di
1aec0 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54  stinct..    ** T
1aed0 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73  he "vtab_err.tes
1aee0 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72  t" test demonstr
1aef0 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66  ates the need of
1af00 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e   this statement.
1af10 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 53   */.    if( IN_S
1af20 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 20 7a  PECIAL_PARSE ) z
1af30 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a  Name[7]++;.  }..
1af40 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
1af50 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
1af60 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
1af70 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
1af80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1af90 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49  IZATION.  if( !I
1afa0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1afb0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1afc0 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44  r *zDb = pDb->zD
1afd0 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  bSName;.    if( 
1afe0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1aff0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1b000 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
1b010 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
1b020 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1b030 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b040 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
1b050 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
1b060 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
1b070 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
1b080 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
1b090 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
1b0a0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1b0b0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1b0c0 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
1b0d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
1b0e0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1b0f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b100 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1b110 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
1b120 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
1b130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1b140 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
1b150 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
1b160 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
1b170 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
1b180 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
1b190 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b1a0 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
1b1b0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
1b1c0 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
1b1d0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
1b1e0 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  =0 ){.    Token 
1b1f0 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c  prevCol;.    Col
1b200 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61  umn *pCol = &pTa
1b210 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
1b220 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d  ol-1];.    pCol-
1b230 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
1b240 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20  FLAG_UNIQUE;.   
1b250 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
1b260 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c  t(&prevCol, pCol
1b270 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ->zName);.    pL
1b280 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
1b290 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1b2a0 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
1b2b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b2c0 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
1b2d0 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a   &prevCol, 0));.
1b2e0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1b2f0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1b300 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
1b310 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
1b320 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  xpr==1 );.    sq
1b330 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
1b340 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c  SortOrder(pList,
1b350 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d   sortOrder);.  }
1b360 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1b370 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
1b380 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69  ngth(pParse, pLi
1b390 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20  st, "index");.  
1b3a0 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1b3b0 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
1b3c0 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
1b3d0 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
1b3e0 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
1b3f0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
1b400 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
1b410 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
1b420 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1b430 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
1b440 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
1b450 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
1b460 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1b470 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
1b480 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1b490 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  LLATE ){.      n
1b4a0 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71  Extra += (1 + sq
1b4b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
1b4c0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b  xpr->u.zToken));
1b4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1b4e0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
1b4f0 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
1b500 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
1b510 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
1b520 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
1b530 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f  ExtraCol = pPk ?
1b540 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20   pPk->nKeyCol : 
1b550 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  1;.  pIndex = sq
1b560 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
1b570 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69  exObject(db, pLi
1b580 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74  st->nExpr + nExt
1b590 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  raCol,.         
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61               nNa
1b5c0 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c  me + nExtra + 1,
1b5d0 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28   &zExtra);.  if(
1b5e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b5f0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
1b600 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b610 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
1b620 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1b630 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ENT(pIndex->aiRo
1b640 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73  wLogEst) );.  as
1b650 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1b660 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
1b670 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
1b680 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
1b690 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
1b6a0 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20   += nName + 1;. 
1b6b0 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
1b6c0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
1b6d0 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
1b6e0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
1b6f0 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
1b700 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
1b710 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  ;.  pIndex->uniq
1b720 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  NotNull = onErro
1b730 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49  r!=OE_None;.  pI
1b740 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  ndex->idxType = 
1b750 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65  idxType;.  pInde
1b760 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
1b770 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1b780 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  a;.  pIndex->nKe
1b790 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  yCol = pList->nE
1b7a0 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68  xpr;.  if( pPIWh
1b7b0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
1b7c0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1b7d0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1b7e0 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c  Tab, NC_PartIdx,
1b7f0 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20   pPIWhere, 0);. 
1b800 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74     pIndex->pPart
1b810 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68  IdxWhere = pPIWh
1b820 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72  ere;.    pPIWher
1b830 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
1b840 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1b850 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1b860 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
1b870 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1b880 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
1b890 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
1b8a0 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
1b8b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
1b8c0 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
1b8d0 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
1b8e0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
1b8f0 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
1b900 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
1b910 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
1b920 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
1b930 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
1b940 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65    /* Analyze the
1b950 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
1b960 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  ions that form t
1b970 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1b980 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72  index and.  ** r
1b990 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73  eport any errors
1b9a0 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  .  In the common
1b9b0 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
1b9c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78  expression is ex
1b9d0 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62  actly.  ** a tab
1b9e0 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65  le column, store
1b9f0 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
1ba00 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72  aiColumn[].  For
1ba10 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73   general express
1ba20 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c  ions,.  ** popul
1ba30 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  ate pIndex->aCol
1ba40 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58  Expr and store X
1ba50 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61  N_EXPR (-2) in a
1ba60 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a  iColumn[]..  **.
1ba70 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
1ba80 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77   a warning if tw
1ba90 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e  o or more column
1baa0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  s of the index a
1bab0 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20  re identical..  
1bac0 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
1bad0 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20   warning if the 
1bae0 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65  table primary ke
1baf0 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  y is used as par
1bb00 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  t of the.  ** in
1bb10 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20  dex key..  */.  
1bb20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c 69 73  pListItem = pLis
1bb30 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52  t->a;.  if( IN_R
1bb40 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1bb50 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c      pIndex->aCol
1bb60 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20  Expr = pList;.  
1bb70 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d    pList = 0;.  }
1bb80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1bb90 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  ndex->nKeyCol; i
1bba0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
1bbb0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78  {.    Expr *pCEx
1bbc0 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
1bbd0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
1bbe0 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
1bbf0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71  n */.    int req
1bc00 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
1bc10 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f          /* ASC o
1bc20 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d  r DESC on the i-
1bc30 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
1bc40 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1bc50 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
1bc60 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
1bc70 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
1bc80 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  /..    sqlite3St
1bc90 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74  ringToId(pListIt
1bca0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1bcb0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1bcc0 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
1bcd0 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78  se, pTab, NC_Idx
1bce0 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d  Expr, pListItem-
1bcf0 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >pExpr, 0);.    
1bd00 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1bd10 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1bd20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
1bd30 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
1bd40 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
1bd50 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
1bd60 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72  ;.    if( pCExpr
1bd70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
1bd80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
1bd90 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
1bda0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
1bdb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1bdc0 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73  pParse, "express
1bdd0 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
1bde0 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  in PRIMARY KEY a
1bdf0 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd ".           
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
1be20 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
1be30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1be40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1be50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1be60 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  ndex->aColExpr==
1be70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  0 ){.        pIn
1be80 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20  dex->aColExpr = 
1be90 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70  pList;.        p
1bea0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
1beb0 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45  }.      j = XN_E
1bec0 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1bed0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1bee0 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20   XN_EXPR;.      
1bef0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
1bf00 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ull = 0;.    }el
1bf10 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43  se{.      j = pC
1bf20 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
1bf30 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d       assert( j<=
1bf40 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20  0x7fff );.      
1bf50 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20  if( j<0 ){.     
1bf60 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b     j = pTab->iPK
1bf70 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ey;.      }else 
1bf80 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  if( pTab->aCol[j
1bf90 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  ].notNull==0 ){.
1bfa0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1bfb0 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
1bfc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1bfd0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1bfe0 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20  i] = (i16)j;.   
1bff0 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30   }.    zColl = 0
1c000 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
1c010 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  tem->pExpr->op==
1c020 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1c030 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
1c040 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69       zColl = pLi
1c050 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75  stItem->pExpr->u
1c060 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
1c070 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
1c080 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20  rlen30(zColl) + 
1c090 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1c0a0 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29   nExtra>=nColl )
1c0b0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
1c0c0 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43  Extra, zColl, nC
1c0d0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  oll);.      zCol
1c0e0 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
1c0f0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c    zExtra += nCol
1c100 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  l;.      nExtra 
1c110 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  -= nColl;.    }e
1c120 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a  lse if( j>=0 ){.
1c130 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
1c140 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
1c150 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
1c160 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20   !zColl ) zColl 
1c170 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1c180 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d  RY;.    if( !db-
1c190 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
1c1a0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1c1b0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1c1c0 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
1c1d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1c1e0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
1c1f0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1c200 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
1c210 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
1c220 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
1c230 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
1c240 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
1c250 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1c260 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
1c270 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
1c280 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  .  /* Append the
1c290 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68   table key to th
1c2a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1c2b0 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54  ex.  For WITHOUT
1c2c0 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c   ROWID.  ** tabl
1c2d0 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29  es (when pPk!=0)
1c2e0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1c2f0 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41  e declared PRIMA
1c300 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a  RY KEY.  For.  *
1c310 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20  * normal tables 
1c320 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68  (when pPk==0) th
1c330 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72  is will be the r
1c340 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  owid..  */.  if(
1c350 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28   pPk ){.    for(
1c360 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
1c370 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1c380 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69   int x = pPk->ai
1c390 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
1c3a0 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
1c3b0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
1c3c0 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43  lumn(pIndex->aiC
1c3d0 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e  olumn, pIndex->n
1c3e0 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20  KeyCol, x) ){.  
1c3f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43        pIndex->nC
1c400 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20  olumn--; .      
1c410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c420 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1c430 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  i] = x;.        
1c440 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1c450 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
1c460 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  j];.        pInd
1c470 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
1c480 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  ] = pPk->aSortOr
1c490 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1c4a0 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
1c4b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
1c4c0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1c4d0 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
1c4e0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1c4f0 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44  mn[i] = XN_ROWID
1c500 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  ;.    pIndex->az
1c510 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1c520 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a  3StrBINARY;.  }.
1c530 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
1c540 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
1c550 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
1c560 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74  ewTable==0 ) est
1c570 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
1c580 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  pIndex);..  /* I
1c590 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e  f this index con
1c5a0 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75  tains every colu
1c5b0 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c  mn of its table,
1c5c0 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20   then mark.  ** 
1c5d0 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  it as a covering
1c5e0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65   index */.  asse
1c5f0 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  rt( HasRowid(pTa
1c600 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61  b) .      || pTa
1c610 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71  b->iPKey<0 || sq
1c620 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
1c630 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d  ex(pIndex, pTab-
1c640 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20  >iPKey)>=0 );.  
1c650 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73  recomputeColumns
1c660 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65  NotIndexed(pInde
1c670 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61  x);.  if( pTblNa
1c680 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d  me!=0 && pIndex-
1c690 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e  >nColumn>=pTab->
1c6a0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64  nCol ){.    pInd
1c6b0 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1c6c0 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   1;.    for(j=0;
1c6d0 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1c6e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a  ++){.      if( j
1c6f0 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20  ==pTab->iPKey ) 
1c700 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c710 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  if( sqlite3Colum
1c720 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1c730 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  j)>=0 ) continue
1c740 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1c750 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a  isCovering = 0;.
1c760 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c770 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54   }.  }..  if( pT
1c780 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1c790 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
1c7a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
1c7b0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
1c7c0 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
1c7d0 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
1c7e0 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
1c7f0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
1c800 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
1c810 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
1c820 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
1c830 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1c840 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1c850 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
1c860 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
1c870 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
1c880 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
1c890 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
1c8a0 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
1c8b0 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
1c8c0 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
1c8d0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
1c8e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1c8f0 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
1c900 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
1c910 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
1c920 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
1c930 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
1c940 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
1c950 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
1c960 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
1c970 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
1c980 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1c990 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
1c9a0 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
1c9b0 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
1c9c0 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
1c9d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1c9e0 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
1c9f0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1ca00 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
1ca10 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
1ca20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
1ca30 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
1ca40 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
1ca50 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
1ca60 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
1ca70 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
1ca80 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
1ca90 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
1caa0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1cab0 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
1cac0 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
1cad0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1cae0 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
1caf0 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
1cb00 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
1cb10 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
1cb20 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
1cb30 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
1cb40 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
1cb50 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
1cb60 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
1cb70 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
1cb80 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
1cb90 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
1cba0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1cbb0 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
1cbc0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1cbd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cbe0 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  pIdx->idxType!=S
1cbf0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
1cc00 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73  PDEF );.      as
1cc10 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1cc20 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a  dex(pIndex) );..
1cc30 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1cc40 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
1cc50 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
1cc60 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
1cc70 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
1cc80 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
1cc90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1cca0 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
1ccb0 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
1ccc0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1ccd0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20  >aiColumn[k]>=0 
1cce0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ccf0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1cd00 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
1cd10 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
1cd20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
1cd30 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1cd40 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
1cd50 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1cd60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cd70 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
1cd80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
1cd90 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
1cda0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
1cdb0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1cdc0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
1cdd0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
1cde0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1cdf0 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
1ce00 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
1ce10 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
1ce20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1ce30 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
1ce40 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
1ce50 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
1ce60 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
1ce70 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
1ce80 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
1ce90 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
1cea0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
1ceb0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
1cec0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
1ced0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
1cee0 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
1cef0 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
1cf00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
1cf10 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1cf20 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
1cf30 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
1cf40 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
1cf50 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
1cf60 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
1cf70 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
1cf80 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1cf90 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
1cfa0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1cfb0 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
1cfc0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1cfd0 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
1cfe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1cff0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d010 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
1d020 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1d030 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
1d040 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d050 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
1d060 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1d070 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
1d080 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
1d090 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
1d0a0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
1d0b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d0c0 20 20 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d     if( idxType==
1d0d0 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
1d0e0 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78  RIMARYKEY ) pIdx
1d0f0 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54  ->idxType = idxT
1d100 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ype;.        if(
1d110 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
1d120 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
1d130 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1d140 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1d150 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
1d160 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20  se->pNewIndex = 
1d170 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
1d180 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1d190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d1a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1d1b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1d1c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1d1d0 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1d1e0 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69  CT ){..    /* Li
1d1f0 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
1d200 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
1d210 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
1d220 68 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  he other.    ** 
1d230 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1d240 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
1d250 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1d260 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1d270 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62  =0 );.    if( db
1d280 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1d290 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
1d2a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 49 4e       assert( !IN
1d2b0 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
1d2c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d2d0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1d2e0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
1d2f0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
1d300 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c  ;.      if( pTbl
1d310 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1d320 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1d330 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
1d340 75 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  um;.        if( 
1d350 73 71 6c 69 74 65 33 49 6e 64 65 78 48 61 73 44  sqlite3IndexHasD
1d360 75 70 6c 69 63 61 74 65 52 6f 6f 74 50 61 67 65  uplicateRootPage
1d370 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
1d380 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1d390 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
1d3a0 6e 76 61 6c 69 64 20 72 6f 6f 74 70 61 67 65 22  nvalid rootpage"
1d3b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1d3c0 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1d3d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d3e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78           goto ex
1d3f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1d400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d410 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c   }.      p = sql
1d420 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1d430 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1d440 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1d450 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1d460 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1d470 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1d480 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1d490 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
1d4a0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1d4b0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
1d4c0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1d4d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  db);.        got
1d4e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1d4f0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1d500 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
1d510 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
1d520 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 0a 20  Change;.    }.. 
1d530 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1d540 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45   the initial CRE
1d550 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1d560 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54  ent (or CREATE T
1d570 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 20 20  ABLE if the.    
1d580 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  ** index is an i
1d590 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72  mplied index for
1d5a0 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49   a UNIQUE or PRI
1d5b0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1d5c0 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20 2a 2a  int) then.    **
1d5d0 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c   emit code to al
1d5e0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
1d5f0 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73   rootpage on dis
1d600 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e  k and make an en
1d610 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74  try for.    ** t
1d620 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  he index in the 
1d630 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1d640 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ble and populate
1d650 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a   the index with.
1d660 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20      ** content. 
1d670 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   But, do not do 
1d680 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73  this if we are s
1d690 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68  imply reading th
1d6a0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
1d6b0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
1d6c0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
1d6d0 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64  , or if this ind
1d6e0 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41 52  ex is the PRIMAR
1d6f0 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 20 20  Y KEY index.    
1d700 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  ** of a WITHOUT 
1d710 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 20  ROWID table..   
1d720 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 54   **.    ** If pT
1d730 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
1d740 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
1d750 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e   generated as an
1d760 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59   implied PRIMARY
1d770 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20 55   KEY.    ** or U
1d780 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61  NIQUE index in a
1d790 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1d7a0 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
1d7b0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
1d7c0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
1d7d0 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
1d7e0 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
1d7f0 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
1d800 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  lization.    ** 
1d810 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
1d820 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ped..    */.    
1d830 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69  else if( HasRowi
1d840 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e  d(pTab) || pTblN
1d850 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
1d860 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20 20 63  Vdbe *v;.      c
1d870 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
1d880 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
1d890 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
1d8a0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
1d8b0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1d8c0 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29        if( v==0 )
1d8d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1d8e0 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20 20  e_index;..      
1d8f0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1d900 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1d910 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 1, iDb);..   
1d920 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
1d930 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
1d940 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72  e index using Cr
1d950 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62  eateIndex. But b
1d960 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 64  efore.      ** d
1d970 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20  oing so, code a 
1d980 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Noop instruction
1d990 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61   and store its a
1d9a0 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20 20  ddress in .     
1d9b0 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20   ** Index.tnum. 
1d9c0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
1d9d0 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69 6e   in case this in
1d9e0 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79 20  dex is actually 
1d9f0 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52 49 4d  a .      ** PRIM
1da00 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20  ARY KEY and the 
1da10 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c  table is actuall
1da20 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  y a WITHOUT ROWI
1da30 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20  D table. In .   
1da40 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20     ** that case 
1da50 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69 74  the convertToWit
1da60 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 29  houtRowidTable()
1da70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1da80 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20 74  place.      ** t
1da90 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20 47  he Noop with a G
1daa0 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72  oto to jump over
1dab0 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20 67   the VDBE code g
1dac0 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e 20  enerated below. 
1dad0 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  */.      pIndex-
1dae0 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56  >tnum = sqlite3V
1daf0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
1db00 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Noop);.      sql
1db10 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1db20 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  , OP_CreateBtree
1db30 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52  , iDb, iMem, BTR
1db40 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20  EE_BLOBKEY);..  
1db50 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
1db60 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
1db70 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
1db80 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
1db90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
1dba0 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
1dbb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1dbc0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1dbd0 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
1dbe0 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
1dbf0 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  oken.z - pName->
1dc00 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61  z) + pParse->sLa
1dc10 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  stToken.n;.     
1dc20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b     if( pName->z[
1dc30 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b  n-1]==';' ) n--;
1dc40 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  .        /* A na
1dc50 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
1dc60 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
1dc70 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1dc80 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74  t */.        zSt
1dc90 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1dca0 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
1dcb0 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
1dcc0 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72             onErr
1dcd0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
1dce0 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c   : " UNIQUE", n,
1dcf0 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
1dd00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dd10 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
1dd20 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
1dd30 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
1dd40 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1dd50 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  aint */.        
1dd60 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
1dd70 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
1dd80 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 20  /.        zStmt 
1dd90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
1dda0 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
1ddb0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
1ddc0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
1ddd0 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  dex.      */.   
1dde0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1ddf0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
1de00 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
1de10 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
1de20 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
1de30 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
1de40 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1de50 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
1de60 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20  TER_NAME,.      
1de70 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1de80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  e,.          pTa
1de90 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
1dea0 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20      iMem,.      
1deb0 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20 20      zStmt.      
1dec0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
1ded0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1dee0 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Stmt);..      /*
1def0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
1df00 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
1df10 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
1df20 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
1df30 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ire.      ** to 
1df40 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
1df50 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
1df60 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a 2f  ements..      */
1df70 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e  .      if( pTblN
1df80 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1df90 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1dfa0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1dfb0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , iMem);.       
1dfc0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1dfd0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1dfe0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1dff0 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
1e000 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 69  hemaOp(pParse, i
1e010 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
1e020 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1e030 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
1e040 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1e050 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29   pIndex->zName))
1e060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1e070 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e080 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b  P_Expire, 0, 1);
1e090 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e0a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1e0b0 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74  ere(v, pIndex->t
1e0c0 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  num);.    }.  }.
1e0d0 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
1e0e0 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
1e0f0 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
1e100 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
1e110 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
1e120 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
1e130 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
1e140 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
1e150 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
1e160 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
1e170 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
1e180 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
1e190 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
1e1a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
1e1b0 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
1e1c0 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
1e1d0 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
1e1e0 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
1e1f0 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1e200 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
1e210 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
1e220 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
1e230 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
1e240 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
1e250 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
1e260 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
1e270 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
1e280 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
1e290 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1e2a0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
1e2b0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
1e2c0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1e2d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e2e0 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
1e2f0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1e300 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
1e310 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
1e320 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
1e330 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1e340 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
1e350 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
1e360 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1e370 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1e380 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1e390 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
1e3a0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
1e3b0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
1e3c0 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69   0;.  }.  else i
1e3d0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1e3e0 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ECT ){.    asser
1e3f0 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49  t( pParse->pNewI
1e400 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ndex==0 );.    p
1e410 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1e420 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1e430 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1e440 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1e450 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1e460 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1e470 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1e480 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64  ) sqlite3FreeInd
1e490 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1e4a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1e4b0 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
1e4c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1e4d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1e4e0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1e4f0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1e500 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
1e510 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e520 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zName);.}../*.*
1e530 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
1e540 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
1e550 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
1e560 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
1e570 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
1e580 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
1e590 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
1e5a0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
1e5b0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
1e5c0 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  0] is supposed t
1e5d0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
1e5e0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1e5f0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
1e600 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
1e610 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
1e620 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
1e630 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
1e640 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
1e650 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1e660 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1e670 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1e680 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
1e690 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
1e6a0 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
1e6b0 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
1e6c0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1e6d0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1e6e0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
1e6f0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
1e700 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
1e710 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
1e720 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
1e730 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
1e740 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
1e750 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
1e760 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
1e770 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
1e780 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
1e790 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1e7a0 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
1e7b0 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
1e7c0 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
1e7d0 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
1e7e0 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
1e7f0 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
1e800 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
1e810 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
1e820 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
1e830 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
1e840 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
1e850 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
1e860 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
1e870 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
1e880 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
1e890 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20  *pIdx){.  /*    
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20              10, 
1e8b0 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a   9,  8,  7,  6 *
1e8c0 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b  /.  LogEst aVal[
1e8d0 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30  ] = { 33, 32, 30
1e8e0 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f  , 28, 26 };.  Lo
1e8f0 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e  gEst *a = pIdx->
1e900 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  aiRowLogEst;.  i
1e910 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41  nt nCopy = MIN(A
1e920 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20  rraySize(aVal), 
1e930 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  pIdx->nKeyCol);.
1e940 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
1e950 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61  ndexes with defa
1e960 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  ult row estimate
1e970 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76  s should not hav
1e980 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a  e stat1 data */.
1e990 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d    assert( !pIdx-
1e9a0 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20  >hasStat1 );..  
1e9b0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
1e9c0 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f   entry (number o
1e9d0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
1e9e0 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69  dex) to the esti
1e9f0 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62  mated .  ** numb
1ea00 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1ea10 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66  e table, or half
1ea20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1ea30 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1ea40 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74  .  ** for a part
1ea50 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74  ial index.   But
1ea60 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
1ea70 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65  estimate drop be
1ea80 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30  low 10. */.  a[0
1ea90 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ] = pIdx->pTable
1eaa0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
1eab0 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
1eac0 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30  dxWhere!=0 ) a[0
1ead0 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74  ] -= 10;  assert
1eae0 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
1eaf0 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20  Est(2) );.  if( 
1eb00 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d  a[0]<33 ) a[0] =
1eb10 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   33;            
1eb20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33        assert( 33
1eb30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1eb40 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74  10) );..  /* Est
1eb50 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20  imate that a[1] 
1eb60 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39  is 10, a[2] is 9
1eb70 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34  , a[3] is 8, a[4
1eb80 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a  ] is 7, a[5] is.
1eb90 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20    ** 6 and each 
1eba0 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65  subsequent value
1ebb0 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20   (if any) is 5. 
1ebc0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b   */.  memcpy(&a[
1ebd0 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a  1], aVal, nCopy*
1ebe0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b  sizeof(LogEst));
1ebf0 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31  .  for(i=nCopy+1
1ec00 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ; i<=pIdx->nKeyC
1ec10 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  ol; i++){.    a[
1ec20 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20  i] = 23;        
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1ec40 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 23==sqlite3L
1ec50 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a  ogEst(5) );.  }.
1ec60 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
1ec70 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
1ec80 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
1ec90 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b  Index(pIdx) ) a[
1eca0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d  pIdx->nKeyCol] =
1ecb0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1ecc0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
1ecd0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
1ece0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
1ecf0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
1ed00 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
1ed10 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
1ed20 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1ed30 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
1ed40 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1ed50 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
1ed60 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
1ed70 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
1ed80 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
1ed90 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1eda0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
1edb0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1edc0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
1edd0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
1ede0 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
1edf0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1ee00 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1ee10 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1ee20 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1ee30 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
1ee40 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
1ee50 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1ee60 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1ee70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1ee80 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1ee90 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
1eea0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1eeb0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
1eec0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
1eed0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
1eee0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
1eef0 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
1ef00 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
1ef10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ef20 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1ef30 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
1ef40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ef50 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1ef60 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
1ef70 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
1ef80 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1ef90 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1efa0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1efb0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
1efc0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1efd0 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
1efe0 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
1eff0 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
1f000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1f010 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
1f020 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1f030 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
1f040 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
1f050 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
1f060 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1f070 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
1f080 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1f090 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1f0a0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1f0b0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
1f0c0 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
1f0d0 33 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28  3SchemaWritable(
1f0e0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 23 69  pParse, iDb);.#i
1f0f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f100 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1f110 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
1f120 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
1f130 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
1f140 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
1f150 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
1f160 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
1f170 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1f180 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
1f190 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
1f1a0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
1f1b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1f1c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1f1d0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
1f1e0 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
1f1f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1f200 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1f210 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
1f220 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
1f230 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1f240 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
1f250 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1f260 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1f270 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
1f280 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
1f290 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1f2a0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1f2b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
1f2c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
1f2d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
1f2e0 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
1f2f0 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
1f300 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
1f310 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1f320 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1f330 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1f340 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1f350 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1f360 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1f370 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1f380 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
1f390 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
1f3a0 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
1f3b0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
1f3c0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1f3d0 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
1f3e0 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78  TER_NAME, pIndex
1f3f0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
1f400 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
1f410 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
1f420 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
1f430 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
1f440 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1f450 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1f460 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
1f470 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
1f480 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
1f490 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
1f4a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f4b0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
1f4c0 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
1f4d0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
1f4e0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
1f4f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1f500 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
1f510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
1f520 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1f530 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
1f540 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
1f550 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
1f560 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
1f570 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
1f580 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
1f590 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1f5a0 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
1f5b0 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
1f5c0 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
1f5d0 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
1f5e0 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
1f5f0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
1f600 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1f610 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
1f620 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
1f630 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
1f640 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
1f650 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
1f660 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
1f670 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
1f680 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
1f690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1f6a0 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
1f6b0 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
1f6c0 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
1f6d0 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
1f6e0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1f6f0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
1f700 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
1f710 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
1f720 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
1f730 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
1f740 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
1f750 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1f760 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
1f770 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
1f780 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
1f790 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
1f7a0 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
1f7b0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
1f7c0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1f7d0 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
1f7e0 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1f7f0 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
1f800 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
1f810 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
1f820 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
1f830 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
1f840 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1f850 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1f860 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1f870 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1f880 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1f890 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
1f8a0 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
1f8b0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
1f8c0 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
1f8d0 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
1f8e0 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
1f8f0 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
1f900 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
1f910 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
1f920 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f930 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
1f940 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
1f950 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
1f960 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
1f970 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
1f980 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
1f990 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20  har *z;.  int n 
1f9a0 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66  = *pnEntry;.  if
1f9b0 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30  ( (n & (n-1))==0
1f9c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d   ){.    int sz =
1f9d0 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a   (n==0) ? 1 : 2*
1f9e0 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  n;.    void *pNe
1f9f0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1fa00 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
1fa10 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20   sz*szEntry);.  
1fa20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1fa30 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
1fa40 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1fa50 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
1fa60 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
1fa70 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
1fa80 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
1fa90 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
1faa0 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
1fab0 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20  .  *pIdx = n;.  
1fac0 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
1fad0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
1fae0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1faf0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1fb00 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
1fb10 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
1fb20 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1fb30 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
1fb40 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
1fb50 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
1fb60 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1fb70 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
1fb80 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61  3IdListAppend(Pa
1fb90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c  rse *pParse, IdL
1fba0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
1fbb0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71  n *pToken){.  sq
1fbc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1fbd0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
1fbe0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1fbf0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1fc00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1fc10 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1fc20 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1fc30 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1fc40 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1fc50 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1fc60 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1fc70 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1fc80 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1fc90 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1fca0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1fcb0 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1fcc0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1fcd0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1fce0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1fcf0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1fd00 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1fd10 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1fd20 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1fd30 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
1fd40 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1fd50 4a 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61  JECT && pList->a
1fd60 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
1fd70 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
1fd80 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
1fd90 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69  void*)pList->a[i
1fda0 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29  ].zName, pToken)
1fdb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fdc0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
1fdd0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
1fde0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fdf0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
1fe00 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
1fe10 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1fe20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1fe30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
1fe40 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1fe50 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
1fe60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1fe70 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1fe80 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
1fe90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1fea0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
1feb0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
1fec0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ist);.}../*.** R
1fed0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
1fee0 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20  in pList of the 
1fef0 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64  identifier named
1ff00 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31   zId.  Return -1
1ff10 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  .** if not found
1ff20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ff30 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69  IdListIndex(IdLi
1ff40 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  st *pList, const
1ff50 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1ff60 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1ff70 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1ff80 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  -1;.  for(i=0; i
1ff90 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1ffa0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1ffb0 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
1ffc0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  >a[i].zName, zNa
1ffd0 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
1ffe0 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1fff0 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  -1;.}../*.** Max
20000 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 20 53  imum size of a S
20010 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a  rcList object..*
20020 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 6f 62  * The SrcList ob
20030 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20  ject is used to 
20040 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 46 52  represent the FR
20050 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 0a 2a  OM clause of a.*
20060 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
20070 6e 74 2c 20 61 6e 64 20 74 68 65 20 71 75 65 72  nt, and the quer
20080 79 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e 6f 74  y planner cannot
20090 20 64 65 61 6c 20 77 69 74 68 20 6d 6f 72 65 0a   deal with more.
200a0 2a 2a 20 74 68 61 6e 20 36 34 20 74 61 62 6c 65  ** than 64 table
200b0 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 53 6f  s in a join.  So
200c0 20 61 6e 79 20 76 61 6c 75 65 20 6c 61 72 67 65   any value large
200d0 72 20 74 68 61 6e 20 36 34 20 68 65 72 65 0a 2a  r than 64 here.*
200e0 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  * is sufficient 
200f0 66 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e 20 20  for most uses.  
20100 53 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73 2c 20  Smaller values, 
20110 6c 69 6b 65 20 73 61 79 20 31 30 2c 20 61 72 65  like say 10, are
20120 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20  .** appropriate 
20130 66 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20 6d 65  for small and me
20140 6d 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61 70 70  mory-limited app
20150 6c 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  lications..*/.#i
20160 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58  fndef SQLITE_MAX
20170 5f 53 52 43 4c 49 53 54 0a 23 20 64 65 66 69 6e  _SRCLIST.# defin
20180 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  e SQLITE_MAX_SRC
20190 4c 49 53 54 20 32 30 30 0a 23 65 6e 64 69 66 0a  LIST 200.#endif.
201a0 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
201b0 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
201c0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
201d0 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
201e0 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
201f0 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
20200 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
20210 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
20220 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
20230 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
20240 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
20250 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
20260 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
20270 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
20280 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
20290 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
202a0 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
202b0 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
202c0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
202d0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
202e0 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
202f0 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
20300 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
20310 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
20320 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
20330 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
20340 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
20350 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
20360 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
20370 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
20380 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
20390 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
203a0 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
203b0 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
203c0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
203d0 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
203e0 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
203f0 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
20400 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
20410 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
20420 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
20430 61 69 6c 73 20 6f 72 20 74 68 65 20 53 72 63 4c  ails or the SrcL
20440 69 73 74 20 62 65 63 6f 6d 65 73 20 74 6f 6f 20  ist becomes too 
20450 6c 61 72 67 65 2c 20 6c 65 61 76 65 0a 2a 2a 20  large, leave.** 
20460 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 72 63  the original Src
20470 4c 69 73 74 20 75 6e 63 68 61 6e 67 65 64 2c 20  List unchanged, 
20480 72 65 74 75 72 6e 20 4e 55 4c 4c 2c 20 61 6e 64  return NULL, and
20490 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
204a0 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
204b0 61 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  arse..*/.SrcList
204c0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
204d0 45 6e 6c 61 72 67 65 28 0a 20 20 50 61 72 73 65  Enlarge(.  Parse
204e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
204f0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20500 20 69 6e 74 6f 20 77 68 69 63 68 20 65 72 72 6f   into which erro
20510 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20  rs are reported 
20520 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
20530 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
20540 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
20550 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
20560 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
20570 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
20580 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
20590 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
205a0 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
205b0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
205c0 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
205d0 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
205e0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
205f0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
20600 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
20610 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
20620 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
20630 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
20640 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
20650 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
20660 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
20670 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
20680 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
20690 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
206a0 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33  ded */.  if( (u3
206b0 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  2)pSrc->nSrc+nEx
206c0 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
206d0 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
206e0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
206f0 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
20700 72 63 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20  rc*2+nExtra;.   
20710 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20720 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 20 20  Parse->db;..    
20730 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  if( pSrc->nSrc+n
20740 45 78 74 72 61 3e 3d 53 51 4c 49 54 45 5f 4d 41  Extra>=SQLITE_MA
20750 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a 20 20 20  X_SRCLIST ){.   
20760 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20770 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
20780 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  many FROM clause
20790 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20 25 64 22   terms, max: %d"
207a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
207b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
207c0 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a 20 20 20  AX_SRCLIST);.   
207d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
207e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 6c 6c 6f   }.    if( nAllo
207f0 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43  c>SQLITE_MAX_SRC
20800 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63 20 3d 20  LIST ) nAlloc = 
20810 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49  SQLITE_MAX_SRCLI
20820 53 54 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  ST;.    pNew = s
20830 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
20840 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20  db, pSrc,.      
20850 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
20860 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63  *pSrc) + (nAlloc
20870 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d  -1)*sizeof(pSrc-
20880 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
20890 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
208a0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
208b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
208c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
208d0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
208e0 70 4e 65 77 3b 0a 20 20 20 20 70 53 72 63 2d 3e  pNew;.    pSrc->
208f0 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b  nAlloc = nAlloc;
20900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
20910 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
20920 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
20930 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
20940 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
20950 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
20960 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
20970 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
20980 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
20990 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
209a0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
209b0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45  pSrc->nSrc += nE
209c0 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  xtra;..  /* Zero
209d0 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
209e0 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  ated slots */.  
209f0 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b  memset(&pSrc->a[
20a00 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  iStart], 0, size
20a10 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e  of(pSrc->a[0])*n
20a20 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d  Extra);.  for(i=
20a30 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74  iStart; i<iStart
20a40 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20  +nExtra; i++){. 
20a50 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43     pSrc->a[i].iC
20a60 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ursor = -1;.  }.
20a70 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  .  /* Return a p
20a80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e  ointer to the en
20a90 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a  larged SrcList *
20aa0 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  /.  return pSrc;
20ab0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
20ac0 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
20ad0 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
20ae0 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
20af0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
20b00 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
20b10 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
20b20 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
20b30 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61  List even if pTa
20b40 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ble is NULL..**.
20b50 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20  ** A SrcList is 
20b60 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
20b70 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  L if there is an
20b80 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72 20 69 66   OOM error or if
20b90 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69 73 74 20   the.** SrcList 
20ba0 67 72 6f 77 73 20 74 6f 20 6c 61 72 67 65 2e 20  grows to large. 
20bb0 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   The returned.**
20bc0 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62   SrcList might b
20bd0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
20be0 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77  e SrcList that w
20bf0 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d  as input or it m
20c00 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77  ight be.** a new
20c10 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d   one.  If an OOM
20c20 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
20c30 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  rs, then the pri
20c40 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73  or value of pLis
20c50 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70  t.** that is inp
20c60 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
20c70 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ne is automatica
20c80 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
20c90 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
20ca0 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
20cb0 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
20cc0 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
20cd0 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
20ce0 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
20cf0 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
20d00 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
20d10 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
20d20 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
20d30 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
20d40 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
20d50 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
20d60 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
20d70 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
20d80 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
20d90 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
20da0 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
20db0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
20dc0 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
20dd0 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
20de0 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
20df0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
20e00 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
20e10 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
20e20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
20e30 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
20e40 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
20e50 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
20e60 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
20e70 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
20e80 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
20e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
20ea0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
20eb0 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
20ec0 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
20ed0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
20ee0 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
20ef0 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
20f00 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
20f10 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
20f20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
20f30 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
20f40 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
20f50 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
20f60 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
20f70 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69  se name.  If C i
20f80 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65  s defined.** the
20f90 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f  n so is B.  In o
20fa0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e  ther words, we n
20fb0 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65  ever have a case
20fc0 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   where:.**.**   
20fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
20fe0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30  ListAppend(D,A,0
20ff0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  ,C);.**.** Both 
21000 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
21010 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64  base are assumed
21020 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
21030 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65  They are dequote
21040 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e  d.** before bein
21050 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  g added to the S
21060 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69  rcList..*/.SrcLi
21070 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
21080 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73  stAppend(.  Pars
21090 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
210a0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
210b0 78 74 2c 20 69 6e 20 77 68 69 63 68 20 65 72 72  xt, in which err
210c0 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65 64  ors are reported
210d0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
210e0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70  List,     /* App
210f0 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c  end to this SrcL
21100 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65  ist. NULL create
21110 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  s a new SrcList 
21120 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
21130 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  le,      /* Tabl
21140 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e to append */. 
21150 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
21160 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e    /* Database
21170 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
21180 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
21190 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
211a0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
211b0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
211c0 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
211d0 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
211e0 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
211f0 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t B */.  assert(
21200 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
21210 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
21220 64 62 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  db!=0 );.  db = 
21230 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
21240 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
21250 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
21260 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
21270 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
21280 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
21290 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
212a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
212b0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
212c0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72  ;.    pList->nSr
212d0 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  c = 1;.    memse
212e0 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20  t(&pList->a[0], 
212f0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
21300 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69  >a[0]));.    pLi
21310 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
21320 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
21330 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
21340 77 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  w = sqlite3SrcLi
21350 73 74 45 6e 6c 61 72 67 65 28 70 50 61 72 73 65  stEnlarge(pParse
21360 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
21370 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20 20 69 66  t->nSrc);.    if
21380 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
21390 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
213a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
213b0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
213c0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
213d0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65       pList = pNe
213e0 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  w;.    }.  }.  p
213f0 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
21400 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b  [pList->nSrc-1];
21410 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
21420 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
21430 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
21440 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
21450 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
21460 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
21470 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
21480 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61  romToken(db, pDa
21490 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49 74  tabase);.    pIt
214a0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
214b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
214c0 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
214d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
214e0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
214f0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
21500 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  en(db, pTable);.
21510 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61      pItem->zData
21520 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
21530 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
21540 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
21550 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
21560 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
21570 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
21580 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
21590 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
215a0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
215b0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
215c0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
215d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
215e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
215f0 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
21600 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
21610 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
21620 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
21630 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
21640 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
21650 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
21660 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21670 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
21680 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
21690 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
216a0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
216b0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
216c0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
216d0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
216e0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
216f0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
21700 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
21710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21720 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
21730 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
21740 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
21750 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
21760 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
21770 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
21780 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
21790 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
217a0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
217b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
217c0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
217d0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
217e0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
217f0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
21800 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
21810 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
21820 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
21830 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
21840 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
21850 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
21860 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
21870 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
21880 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
21890 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
218a0 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c 69  IndexedBy ) sqli
218b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
218c0 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
218d0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  By);.    if( pIt
218e0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
218f0 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
21900 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
21910 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29  em->u1.pFuncArg)
21920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
21930 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
21940 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
21950 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
21960 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
21970 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
21980 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
21990 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
219a0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
219b0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
219c0 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
219d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
219e0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
219f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
21a00 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
21a10 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
21a20 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
21a30 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
21a40 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
21a50 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
21a60 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
21a70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
21a80 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
21a90 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21aa0 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
21ab0 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
21ac0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
21ad0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
21ae0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
21af0 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
21b00 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
21b10 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
21b20 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
21b30 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
21b40 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
21b50 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
21b60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
21b70 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
21b80 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
21b90 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
21ba0 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
21bb0 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
21bc0 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
21bd0 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
21be0 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
21bf0 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
21c00 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
21c10 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
21c20 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
21c30 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
21c40 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
21c50 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
21c60 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
21c70 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
21c80 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
21c90 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
21ca0 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
21cb0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
21cc0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
21cd0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
21ce0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
21cf0 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
21d00 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
21d10 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
21d20 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
21d30 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
21d40 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
21d50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21d60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
21d70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
21d80 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
21d90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21da0 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
21db0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
21dc0 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
21dd0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
21de0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21df0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
21e00 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
21e10 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
21e20 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
21e30 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21e40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
21e50 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
21e60 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
21e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21e80 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
21e90 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
21ea0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
21eb0 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
21ec0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
21ed0 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
21ee0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
21ef0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
21f00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
21f10 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
21f20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
21f30 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
21f40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
21f50 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
21f60 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
21f70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21f80 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
21f90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21fa0 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
21fb0 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
21fc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21fd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21fe0 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
21ff0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
22000 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
22010 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
22020 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
22030 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
22040 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
22050 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
22060 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
22070 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
22080 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
22090 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
220a0 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
220b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
220c0 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74  >nSrc>0 );.  pIt
220d0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
220e0 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
220f0 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70   (pTable==0)==(p
22100 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a  Database==0) );.
22110 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
22120 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61  >zName==0 || pDa
22130 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20 20 69  tabase!=0 );.  i
22140 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
22150 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ECT && pItem->zN
22160 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ame ){.    Token
22170 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41   *pToken = (ALWA
22180 59 53 28 70 44 61 74 61 62 61 73 65 29 20 26 26  YS(pDatabase) &&
22190 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f   pDatabase->z) ?
221a0 20 70 44 61 74 61 62 61 73 65 20 3a 20 70 54 61   pDatabase : pTa
221b0 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ble;.    sqlite3
221c0 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
221d0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e  Parse, pItem->zN
221e0 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  ame, pToken);.  
221f0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69  }.  assert( pAli
22200 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  as!=0 );.  if( p
22210 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20  Alias->n ){.    
22220 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  pItem->zAlias = 
22230 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
22240 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29  oken(db, pAlias)
22250 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70  ;.  }.  pItem->p
22260 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65  Select = pSubque
22270 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e  ry;.  pItem->pOn
22280 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d   = pOn;.  pItem-
22290 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67  >pUsing = pUsing
222a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20  ;.  return p;.. 
222b0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
222c0 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  r:.  assert( p==
222d0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
222e0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e  prDelete(db, pOn
222f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
22300 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73  stDelete(db, pUs
22310 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ing);.  sqlite3S
22320 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
22330 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65  pSubquery);.  re
22340 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
22350 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20   Add an INDEXED 
22360 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
22370 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  D clause to the 
22380 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
22390 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  ded .** element 
223a0 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  of the source-li
223b0 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
223c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
223d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
223e0 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
223f0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
22400 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b   SrcList *p, Tok
22410 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b  en *pIndexedBy){
22420 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65  .  assert( pInde
22430 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  xedBy!=0 );.  if
22440 28 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42  ( p && pIndexedB
22450 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74  y->n>0 ){.    st
22460 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22470 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
22480 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
22490 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
224a0 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
224b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
224c0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
224d0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
224e0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
224f0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
22500 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
22510 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
22520 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
22530 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
22540 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
22550 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
22560 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
22570 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
22580 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
22590 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
225a0 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
225b0 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
225c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
225d0 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
225e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
225f0 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
22600 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e  xedBy = sqlite3N
22610 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
22620 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
22630 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65  dBy);.      pIte
22640 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
22650 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 1;.    }.  }
22660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
22670 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
22680 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
22690 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
226a0 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
226b0 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
226c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
226d0 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
226e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
226f0 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
22700 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
22710 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
22720 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22730 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
22740 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
22750 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
22760 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
22770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22780 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
22790 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
227a0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
227b0 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
227c0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
227d0 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
227e0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
227f0 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
22800 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
22810 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
22820 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
22830 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
22840 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
22850 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
22860 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
22870 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
22880 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
22890 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
228a0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
228b0 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
228c0 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
228d0 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
228e0 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
228f0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
22900 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
22910 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
22920 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
22930 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
22940 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
22950 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
22960 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
22970 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
22980 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
22990 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
229a0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
229b0 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
229c0 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
229d0 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
229e0 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
229f0 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
22a00 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
22a10 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
22a20 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
22a30 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
22a40 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
22a50 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
22a60 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
22a70 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
22a80 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
22a90 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
22aa0 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
22ab0 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
22ac0 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
22ad0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
22ae0 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
22af0 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
22b00 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
22b10 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
22b20 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
22b30 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
22b40 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
22b50 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
22b60 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
22b70 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
22b80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
22b90 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
22ba0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22bb0 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
22bc0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
22bd0 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
22be0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
22bf0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
22c00 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
22c10 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
22c20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
22c30 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
22c40 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
22c50 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
22c60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
22c70 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
22c80 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
22c90 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
22ca0 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
22cb0 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
22cc0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
22cd0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
22ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22cf0 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
22d00 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
22d10 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
22d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22d30 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
22d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
22d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
22d60 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
22d70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
22d80 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
22d90 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52  or a COMMIT or R
22da0 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e  OLLBACK statemen
22db0 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52  t..** Code for R
22dc0 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72  OLLBACK is gener
22dd0 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54  ated if eType==T
22de0 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68  K_ROLLBACK.  Oth
22df0 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69  erwise.** code i
22e00 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  s generated for 
22e10 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69  a COMMIT..*/.voi
22e20 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e  d sqlite3EndTran
22e30 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
22e40 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65  Parse, int eType
22e50 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
22e60 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a  int isRollback;.
22e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
22e80 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
22e90 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
22ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
22eb0 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c  pe==TK_COMMIT ||
22ec0 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c   eType==TK_END |
22ed0 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  | eType==TK_ROLL
22ee0 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c  BACK );.  isRoll
22ef0 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b  back = eType==TK
22f00 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28  _ROLLBACK;.  if(
22f10 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
22f20 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
22f30 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20  _TRANSACTION, . 
22f40 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b        isRollback
22f50 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20   ? "ROLLBACK" : 
22f60 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
22f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
22f80 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
22f90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
22fa0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
22fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22fc0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
22fd0 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63  it, 1, isRollbac
22fe0 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
22ff0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
23000 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
23010 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
23020 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
23030 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
23040 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
23050 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
23060 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
23070 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
23080 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
23090 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
230a0 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
230b0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
230c0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
230d0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
230e0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
230f0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
23100 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
23110 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
23120 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
23130 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
23140 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
23150 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
23160 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
23170 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
23180 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
23190 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
231a0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
231b0 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
231c0 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
231d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
231e0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
231f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
23200 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
23210 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
23220 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23230 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
23240 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
23250 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
23260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23270 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
23280 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
23290 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
232a0 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
232b0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
232c0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
232d0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
232e0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
232f0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
23300 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
23310 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
23320 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
23330 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
23340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
23350 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
23360 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
23370 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23380 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
23390 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
233a0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
233b0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
233c0 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
233d0 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
233e0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
233f0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
23400 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
23410 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
23420 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
23430 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
23440 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
23450 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
23460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23470 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
23480 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
23490 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
234a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
234b0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
234c0 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
234d0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
234e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
234f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
23500 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
23510 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
23520 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
23530 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
23540 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
23550 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
23560 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
23570 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
23580 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
23590 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
235a0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
235b0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
235c0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
235d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
235e0 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
235f0 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
23600 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
23610 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
23620 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
23630 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
23640 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
23650 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
23660 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
23670 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
23680 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69  schema cookie wi
23690 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65  ll need to be ve
236a0 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61  rified.** for da
236b0 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65  tabase iDb.  The
236c0 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c   code to actuall
236d0 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  y verify the sch
236e0 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69  ema cookie.** wi
236f0 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ll occur at the 
23700 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  end of the top-l
23710 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69  evel VDBE and wi
23720 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  ll be generated.
23730 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c  ** later, by sql
23740 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
23750 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
23760 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
23770 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
23780 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
23790 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
237a0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
237b0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
237c0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
237d0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
237e0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
237f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
23800 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
23810 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
23820 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
23830 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
23840 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
23850 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
23860 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64  exHeld(pParse->d
23870 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
23880 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
23890 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
238a0 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
238b0 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
238c0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
238d0 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
238e0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
238f0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
23900 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
23910 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
23920 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
23930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
23940 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
23950 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
23960 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23970 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
23980 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
23990 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
239a0 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
239b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
239c0 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
239d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
239e0 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
239f0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
23a00 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
23a10 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
23a20 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
23a30 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
23a40 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
23a50 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
23a60 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
23a70 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
23a80 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
23a90 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
23aa0 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  Db, pDb->zDbSNam
23ab0 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
23ac0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
23ad0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
23ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
23af0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
23b00 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
23b10 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
23b20 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
23b30 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
23b40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
23b50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23b60 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
23b70 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
23b80 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
23b90 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
23ba0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
23bb0 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
23bc0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
23bd0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
23be0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
23bf0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
23c00 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
23c10 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
23c20 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
23c30 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
23c40 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
23c50 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
23c60 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
23c70 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
23c80 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
23c90 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
23ca0 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
23cb0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
23cc0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
23cd0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
23ce0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
23cf0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
23d00 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
23d10 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
23d20 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
23d30 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
23d40 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
23d50 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
23d60 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
23d70 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
23d80 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
23d90 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
23da0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
23db0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
23dc0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
23dd0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
23de0 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
23df0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
23e00 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
23e10 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
23e20 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
23e30 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
23e40 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
23e50 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
23e60 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
23e70 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
23e80 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
23e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
23ea0 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
23eb0 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
23ec0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
23ed0 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
23ee0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
23ef0 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
23f00 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
23f10 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
23f20 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
23f30 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
23f40 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
23f50 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
23f60 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
23f70 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
23f80 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
23f90 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
23fa0 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
23fb0 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
23fc0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
23fd0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
23fe0 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
23ff0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
24000 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
24010 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
24020 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
24030 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
24040 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
24050 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
24060 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
24070 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
24080 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
24090 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
240a0 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
240b0 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
240c0 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
240d0 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
240e0 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
240f0 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
24100 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
24110 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
24120 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
24130 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
24140 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
24150 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
24160 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
24170 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
24180 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
24190 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
241a0 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
241b0 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
241c0 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
241d0 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
241e0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
241f0 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
24200 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
24210 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
24220 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
24230 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
24240 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
24250 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
24260 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
24270 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
24280 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
24290 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
242a0 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
242b0 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
242c0 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
242d0 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
242e0 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
242f0 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
24300 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
24310 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
24320 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
24330 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
24340 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
24350 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
24360 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
24370 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
24380 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
24390 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
243a0 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
243b0 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
243c0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
243d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
243e0 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
243f0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
24400 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
24410 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
24420 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
24430 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
24440 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
24450 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
24460 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
24470 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
24480 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
24490 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
244a0 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
244b0 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
244c0 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
244d0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
244e0 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
244f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
24500 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
24510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
24520 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
24530 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
24540 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24550 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
24560 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
24570 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
24580 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
24590 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
245a0 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
245b0 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
245c0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
245d0 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
245e0 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
245f0 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
24600 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
24610 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
24620 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
24630 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
24640 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
24650 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
24660 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
24670 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
24680 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
24690 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
246a0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
246b0 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
246c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
246d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
246e0 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
246f0 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
24700 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  4type);.  sqlite
24710 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
24720 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
24730 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
24740 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
24750 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
24760 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
24770 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
24780 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
24790 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
247a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
247b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
247c0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
247d0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
247e0 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
247f0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
24800 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
24810 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
24820 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
24830 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
24840 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
24850 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
24860 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
24870 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
24880 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
24890 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
248a0 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
248b0 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f  .  if( pIdx->aCo
248c0 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  lExpr ){.    sql
248d0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
248e0 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  (&errMsg, "index
248f0 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e   '%q'", pIdx->zN
24900 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
24910 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
24920 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
24930 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
24940 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Col;.      asser
24950 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
24960 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[j]>=0 );.     
24970 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
24980 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
24990 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
249a0 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
249b0 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65  e3_str_append(&e
249c0 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
249d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
249e0 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72  tr_appendall(&er
249f0 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  rMsg, pTab->zNam
24a00 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
24a10 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
24a20 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20  rMsg, ".", 1);. 
24a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
24a40 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d  _appendall(&errM
24a50 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  sg, zCol);.    }
24a60 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
24a70 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
24a80 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
24a90 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
24aa0 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
24ab0 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
24ac0 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
24ad0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
24ae0 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
24b10 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
24b20 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
24b30 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
24b40 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
24b50 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
24b60 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
24b70 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
24b80 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
24b90 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
24ba0 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
24bb0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
24bc0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
24bd0 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
24be0 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
24bf0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
24c00 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
24c10 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
24c20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
24c30 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
24c40 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
24c50 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
24c60 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
24c70 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
24c80 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
24c90 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
24ca0 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
24cb0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
24ce0 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
24cf0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
24d00 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
24d10 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
24d20 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
24d30 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
24d40 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
24d50 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
24d60 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
24d70 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
24d80 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
24d90 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
24da0 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
24db0 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
24dc0 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
24df0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
24e00 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
24e10 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
24e20 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
24e30 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
24e40 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
24e50 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
24e60 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
24e70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24e80 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
24e90 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
24ea0 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
24eb0 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
24ec0 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
24ed0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
24ee0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
24ef0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
24f00 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
24f10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
24f20 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
24f30 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
24f40 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
24f50 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
24f60 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
24f70 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
24f80 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
24f90 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
24fa0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24fb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
24fc0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
24fd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
24fe0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
24ff0 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
25000 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
25010 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
25020 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
25030 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
25040 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
25050 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
25060 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
25070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
25080 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
25090 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
250a0 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
250b0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20   *zColl){.  if( 
250c0 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
250d0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
250e0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
250f0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
25100 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25110 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  pTab */..    for
25120 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
25130 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
25140 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
25150 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  xt){.      if( z
25160 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
25170 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
25180 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
25190 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
251a0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
251b0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
251c0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
251d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
251e0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
251f0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
25200 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25210 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
25220 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
25230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25240 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
25250 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
25260 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
25270 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
25280 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
25290 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
252a0 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
252b0 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
252c0 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
252d0 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
252e0 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
252f0 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
25300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
25310 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
25320 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
25330 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
25340 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
25350 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
25360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25370 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
25380 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
25390 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
253a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
253b0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
253c0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
253d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
253e0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
253f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
25400 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
25410 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
25420 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
25430 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
25440 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
25450 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
25460 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
25470 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
25480 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
25490 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
254a0 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
254b0 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66   );  /* Needed f
254c0 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
254d0 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c   */.  for(iDb=0,
254e0 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
254f0 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
25500 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
25510 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
25520 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
25530 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
25540 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
25550 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
25560 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
25570 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
25580 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
25590 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
255a0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
255b0 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
255c0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
255d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
255e0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
255f0 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
25600 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
25610 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
25630 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
25640 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
25650 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
25660 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
25670 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
25680 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
25690 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
256a0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
256b0 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
256c0 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
256d0 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
256e0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
256f0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
25700 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
25710 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
25720 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
25730 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
25740 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
25750 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
25760 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
25770 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
25780 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
25790 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
257a0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
257b0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
257c0 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
257d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
257e0 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
257f0 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
25800 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
25810 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
25820 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
25830 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
25840 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
25850 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
25860 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
25870 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
25880 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
25890 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
258a0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
258b0 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
258c0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
258d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
258e0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
258f0 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
25900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25910 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
25920 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
25930 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
25940 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
25950 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
25960 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
25970 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
25980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25990 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
259a0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
259b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
259c0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
259d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
259e0 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
259f0 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
25a00 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
25a10 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
25a20 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
25a30 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
25a40 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
25a50 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
25a60 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
25a70 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
25a80 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
25a90 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
25aa0 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
25ab0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
25ac0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
25ad0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
25ae0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
25af0 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
25b00 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
25b10 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
25b20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
25b30 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61  se if( NEVER(pNa
25b40 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65  me2==0) || pName
25b50 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63  2->z==0 ){.    c
25b60 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20  har *zColl;.    
25b70 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
25b80 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d  z );.    zColl =
25b90 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
25ba0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
25bb0 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
25bc0 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
25bd0 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  rn;.    pColl = 
25be0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
25bf0 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
25c00 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69  zColl, 0);.    i
25c10 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
25c20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
25c30 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  es(pParse, zColl
25c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25c50 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
25c60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
25c70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25c80 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
25c90 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
25ca0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
25cb0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
25cc0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
25cd0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
25ce0 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
25cf0 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
25d00 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
25d10 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
25d20 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
25d30 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
25d40 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54  ].zDbSName;.  pT
25d50 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
25d60 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
25d70 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
25d80 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
25d90 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
25da0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
25db0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
25dc0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
25dd0 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
25de0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
25df0 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
25e00 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
25e10 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
25e20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
25e30 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
25e40 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
25e50 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
25e60 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
25e70 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
25e80 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
25e90 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
25ea0 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
25eb0 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
25ec0 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
25ed0 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
25ee0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25ef0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
25f00 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  e that is approp
25f10 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
25f20 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ven Index..**.**
25f30 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
25f40 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
25f50 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20  3KeyInfoUnref() 
25f60 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
25f70 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69  object.** when i
25f80 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75  t has finished u
25f90 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49  sing it..*/.KeyI
25fa0 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
25fb0 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65  nfoOfIndex(Parse
25fc0 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
25fd0 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
25fe0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
25ff0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
26000 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e  nt nKey = pIdx->
26010 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e  nKeyCol;.  KeyIn
26020 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20  fo *pKey;.  if( 
26030 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
26040 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
26050 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
26060 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73   ){.    pKey = s
26070 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
26080 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
26090 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b  Key, nCol-nKey);
260a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
260b0 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
260c0 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
260d0 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
260e0 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b   }.  if( pKey ){
260f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
26100 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
26110 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a  teable(pKey) );.
26120 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
26130 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
26140 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
26150 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
26160 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  l[i];.      pKey
26170 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  ->aColl[i] = zCo
26180 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49  ll==sqlite3StrBI
26190 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20  NARY ? 0 :.     
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
261c0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
261d0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
261e0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
261f0 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
26200 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
26210 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
26220 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Err ){.      ass
26230 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d  ert( pParse->rc=
26240 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49  =SQLITE_ERROR_MI
26250 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b  SSING_COLLSEQ );
26260 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
26270 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a  >bNoQuery==0 ){.
26280 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74          /* Deact
26290 69 76 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ivate the index 
262a0 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61  because it conta
262b0 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63  ins an unknown c
262c0 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20  ollating.       
262d0 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54   ** sequence.  T
262e0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72  he only way to r
262f0 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
26300 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74  x is to reload t
26310 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63  he.        ** sc
26320 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68  hema.  Adding th
26330 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74  e missing collat
26340 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74  ing sequence lat
26350 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  er does not.    
26360 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20      ** reactive 
26370 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  the index.  The 
26380 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20  application had 
26390 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65  the chance to re
263a0 67 69 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a  gister.        *
263b0 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e  * the missing in
263c0 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f  dex using the co
263d0 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63  llation-needed c
263e0 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20  allback.  For.  
263f0 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63        ** simplic
26400 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c  ity, SQLite will
26410 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61 70   not give the ap
26420 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f  plication a seco
26430 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20  nd chance..     
26440 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49     */.        pI
26450 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31  dx->bNoQuery = 1
26460 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
26470 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
26480 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20  ROR_RETRY;.     
26490 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
264a0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
264b0 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  y);.      pKey =
264c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
264d0 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a  return pKey;.}..
264e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
264f0 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54  MIT_CTE./* .** T
26500 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
26510 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20  nvoked once per 
26520 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65  CTE by the parse
26530 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20  r while parsing 
26540 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  a .** WITH claus
26550 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c  e. .*/.With *sql
26560 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50  ite3WithAdd(.  P
26570 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
26580 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
26590 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
265a0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
265b0 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69         /* Existi
265c0 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20  ng WITH clause, 
265d0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
265e0 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
265f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
26600 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  the common-table
26610 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
26620 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a  pArglist,     /*
26630 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e   Optional column
26640 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74   name list for t
26650 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  he table */.  Se
26660 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20  lect *pQuery    
26670 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75        /* Query u
26680 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
26690 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  e the table */.)
266a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
266b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
266c0 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68  With *pNew;.  ch
266d0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a  ar *zName;..  /*
266e0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
266f0 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  CTE name is uniq
26700 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57  ue within this W
26710 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20  ITH clause. If. 
26720 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61   ** not, store a
26730 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
26740 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
26750 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
26760 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
26770 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
26780 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
26790 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20  e && pWith ){.  
267a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
267b0 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
267c0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
267d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
267e0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68  Cmp(zName, pWith
267f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
26800 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26810 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26820 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57  se, "duplicate W
26830 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20  ITH table name: 
26840 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
26850 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
26860 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
26870 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
26880 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
26890 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
268a0 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
268b0 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
268c0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
268d0 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
268e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
268f0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
26900 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
26910 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
26920 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
26930 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65  pNew!=0 && zName
26940 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  !=0) || db->mall
26950 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69  ocFailed );..  i
26960 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26970 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
26980 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
26990 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a  (db, pArglist);.
269a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
269b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65  tDelete(db, pQue
269c0 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
269d0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
269e0 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57  );.    pNew = pW
269f0 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ith;.  }else{.  
26a00 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
26a10 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20  nCte].pSelect = 
26a20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77  pQuery;.    pNew
26a30 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
26a40 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74  pCols = pArglist
26a50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
26a60 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20  ew->nCte].zName 
26a70 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65  = zName;.    pNe
26a80 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
26a90 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  .zCteErr = 0;.  
26aa0 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
26ab0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
26ac0 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
26ad0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
26ae0 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
26af0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
26b00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
26b10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26b20 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
26b30 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
26b40 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
26b50 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
26b60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
26b70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
26b80 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
26b90 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
26ba0 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
26bb0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
26bc0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
26bd0 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
26be0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
26bf0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
26c00 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
26c10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
26c20 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
26c30 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26c40 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
26c50 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
26c60 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26c70 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.