/ Hex Artifact Content
Login

Artifact 1872ee2d0e09df69081ed25402b3e381d20df49981084d441e99e4dfe4d553fd:


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 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2200: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
2230: 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f  (saveBuf, PARSE_
2240: 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41  TAIL(pParse), PA
2250: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2260: 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49  memset(PARSE_TAI
2270: 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41  L(pParse), 0, PA
2280: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2290: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
22a0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
22b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
22d0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
22f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53  );.  memcpy(PARS
2300: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
2310: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2320: 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AIL_SZ);.  pPars
2330: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2350: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2370: 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68   if zTable is th
2380: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
2390: 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20  stem table that 
23a0: 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69  stores the.** li
23b0: 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20  st of users and 
23c0: 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65  their access cre
23d0: 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74  dentials..*/.int
23e0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
23f0: 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  Table(const char
2400: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74   *zTable){.  ret
2410: 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69  urn sqlite3_stri
2420: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
2430: 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d  ite_user")==0;.}
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c  .#endif../*.** L
2450: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2460: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
2470: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
2480: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
2490: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
24a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
24b0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
24c0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
24d0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
24e0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
24f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2500: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2510: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2520: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2530: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2540: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2550: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2560: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2570: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2580: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
2590: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
25a0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
25b0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
25c0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
25d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
25e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
25f0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2600: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2620: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2630: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2640: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2650: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2660: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2670: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2680: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2690: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
26a0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
26b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c   int i;..  /* Al
26c0: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
26d0: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
26e0: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
26f0: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2700: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2710: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2720: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2730: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2740: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2750: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2760: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
2770: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
2780: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
2790: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27b0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
27c0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
27d0: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
27e0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
27f0: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2810: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
2820: 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69  le(1){.    for(i
2830: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2840: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2850: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c       int j = (i<
2860: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
2870: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
2880: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
2890: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
28a0: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
28b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
28c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
28d0: 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  SName)==0 ){.   
28e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
28f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2900: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
2910: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2920: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2930: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2940: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2960: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2980: 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66  * Not found.  If
2990: 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72   the name we wer
29a0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61  e looking for wa
29b0: 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61  s temp.sqlite_ma
29c0: 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ster.    ** then
29d0: 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65   change the name
29e0: 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   to sqlite_temp_
29f0: 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61  master and try a
2a00: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2a10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a20: 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  zName, MASTER_NA
2a30: 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ME)!=0 ) break;.
2a40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a50: 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73  stricmp(zDatabas
2a60: 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44  e, db->aDb[1].zD
2a70: 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65  bSName)!=0 ) bre
2a80: 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ak;.    zName = 
2a90: 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45  TEMP_MASTER_NAME
2aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2ac0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2ad0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2ae0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2af0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2b00: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2b10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2b20: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2b30: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2b40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2b50: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2b60: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2b80: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2b90: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2ba0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2bb0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2bc0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2bd0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2be0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2bf0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2c00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2c10: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2c20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2c30: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2c40: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2c50: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2c60: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2c70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2c80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2c90: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2ca0: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2cb0: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2cc0: 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20    u32 flags,    
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41           /* LOCA
2ce0: 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54  TE_VIEW or LOCAT
2cf0: 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e  E_NOERR */.  con
2d00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2d30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2d50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2d70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2d80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2d90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2da0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2db0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2dc0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2dd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2de0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2df0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2e00: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2e20: 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e  . */.  if( (db->
2e30: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
2e40: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
2e50: 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54  ==0 .   && SQLIT
2e60: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
2e70: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a  dSchema(pParse).
2e80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e90: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2ea0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
2eb0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
2ec0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ef0: 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  E.    /* If zNam
2f00: 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65  e is the not the
2f10: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
2f20: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63   in the schema c
2f30: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
2f40: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2f50: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2f60: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2f70: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2f80: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ble that.    ** 
2f90: 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d  can be an eponym
2fa0: 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
2fb0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
2fc0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61  arse->disableVta
2fd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f  b==0 ){.      Mo
2fe0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2ff0: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
3000: 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
3010: 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le, zName);.    
3020: 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26    if( pMod==0 &&
3030: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
3040: 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
3050: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
3060: 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69       pMod = sqli
3070: 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65 67  te3PragmaVtabReg
3080: 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29  ister(db, zName)
3090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30a0: 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69  if( pMod && sqli
30b0: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
30c0: 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65  TableInit(pParse
30d0: 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  , pMod) ){.     
30e0: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
30f0: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d  pEpoTab;.      }
3100: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3110: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c 4f    if( flags & LO
3120: 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65 74  CATE_NOERR ) ret
3130: 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72 73  urn 0;.    pPars
3140: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
3150: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
3160: 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26 20  IsVirtual(p) && 
3170: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
3180: 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20 30  tab ){.    p = 0
3190: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d  ;.  }..  if( p==
31a0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
31b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
31c0: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
31d0: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
31e0: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
31f0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
3200: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
3210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3220: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3230: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3240: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
3250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3260: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3270: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3280: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3290: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  }..  return p;.}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
32b0: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
32c0: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
32d0: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
32e0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
32f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
3300: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
3310: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
3320: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
3330: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
3340: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
3350: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
3360: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
3370: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
3380: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
3390: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
33a0: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
33b0: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
33c0: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
33d0: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
33e0: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
33f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
3400: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
3410: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
3420: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3430: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
3440: 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20  *pParse, .  u32 
3450: 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20  flags,.  struct 
3460: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3470: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3480: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3490: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
34a0: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
34b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
34c0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
34d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
34e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
34f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
3500: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
3510: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3520: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d  b].zDbSName;.  }
3530: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3540: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3550: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3560: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3570: 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e  arse, flags, p->
3580: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
3590: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
35a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
35b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
35c0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
35d0: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
35e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
35f0: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
3600: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
3610: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
3620: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
3630: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
3640: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
3650: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
3660: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
3670: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
3680: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
3690: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
36a0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
36b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
36c0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
36d0: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
36e0: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
36f0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
3700: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
3710: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
3720: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
3730: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
3740: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
3750: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
3760: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
3770: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
3780: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3790: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
37a0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
37b0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
37c0: 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20  int i;.  /* All 
37d0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
37e0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
37f0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
3800: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
3810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3820: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3830: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3840: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3850: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3860: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3870: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3880: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3890: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
38a0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
38b0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
38c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
38d0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
38e0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
38f0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
3900: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
3910: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
3920: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
3930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3940: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3950: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
3960: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
3970: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
3980: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
3990: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
39a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
39b0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
39c0: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
39d0: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
39e0: 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ndex.*/.void sql
39f0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71  ite3FreeIndex(sq
3a00: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
3a10: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
3a20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
3a30: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
3a40: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
3a50: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , p);.#endif.  s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
3a80: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
3a90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3aa0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29  db, p->aColExpr)
3ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3ac0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3ad0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3ae0: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3af0: 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20  bFree(db, (void 
3b00: 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  *)p->azColl);.#i
3b10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3b20: 4c 45 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74  LE_STAT4.  sqlit
3b30: 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77  e3_free(p->aiRow
3b40: 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  Est);.#endif.  s
3b50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b60: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3b70: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3b80: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3b90: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3ba0: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
3bb0: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
3bc0: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
3bd0: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
3be0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
3bf0: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
3c00: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
3c10: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
3c20: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3c30: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
3c40: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
3c50: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3c60: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3c70: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3c80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3c90: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3ca0: 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48  ndex;.  Hash *pH
3cb0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
3cc0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3cd0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3ce0: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3cf0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3d00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3d10: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
3d20: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
3d30: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29  sh, zIdxName, 0)
3d40: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
3d50: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66  Index) ){.    if
3d60: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
3d70: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
3d80: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
3d90: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3da0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3dc0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
3dd0: 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
3de0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b  ion of ALWAYS();
3df0: 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74    The index must
3e00: 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20   be on the list 
3e10: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  of.      ** indi
3e20: 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20  ces. */.      p 
3e30: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
3e40: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
3e50: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29  while( ALWAYS(p)
3e60: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
3e70: 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70  ndex ){ p = p->p
3e80: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66  Next; }.      if
3e90: 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d  ( ALWAYS(p && p-
3ea0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20  >pNext==pIndex) 
3eb0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3ec0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3ed0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3ee0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72   }.    sqlite3Fr
3ef0: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3f00: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d  ex);.  }.  db->m
3f10: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
3f20: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
3f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3f40: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
3f50: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
3f60: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
3f70: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3f80: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3f90: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3fa0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3fb0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3fc0: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3fd0: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3fe0: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3ff0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
4000: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
4010: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
4020: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
4030: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
4040: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
4050: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
4060: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
4070: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4080: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
4090: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
40a0: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
40b0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
40c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
40d0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
40e0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
40f0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
4100: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4110: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  e(db, pDb->zDbSN
4120: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
4130: 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zDbSName = 0;. 
4140: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
4160: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
4170: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
4180: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
4190: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20  ;.  }.  db->nDb 
41a0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
41b0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
41c0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
41d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
41e0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
41f0: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4200: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4220: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4230: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4240: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4250: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4260: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4270: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4280: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
4290: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
42a0: 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65  chema.  The rese
42b0: 74 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66  t is deferred if
42c0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
42d0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a   is not zero..**
42e0: 20 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73   Deferred resets
42f0: 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63   may be run by c
4300: 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c  alling with iDb<
4310: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4320: 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
4330: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4340: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b  t iDb){.  int i;
4350: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64  .  assert( iDb<d
4360: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
4370: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
4380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4390: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
43a0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
43b0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
43c0: 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74  b, iDb, DB_Reset
43d0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53  Wanted);.    DbS
43e0: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31  etProperty(db, 1
43f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4400: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  );.    db->mDbFl
4410: 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53  ags &= ~DBFLAG_S
4420: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20  chemaKnownOk;.  
4430: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63  }..  if( db->nSc
4440: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4450: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
4460: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4470: 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70     if( DbHasProp
4480: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52  erty(db, i, DB_R
4490: 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20  esetWanted) ){. 
44a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
44b0: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
44c0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[i].pSchema);. 
44d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
44e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
44f0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4500: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4510: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4520: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4530: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4540: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4550: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4560: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4570: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4580: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4590: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
45a0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
45b0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
45c0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
45d0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
45e0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
45f0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4600: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
4610: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
4620: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4640: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
4650: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
4660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4670: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
4680: 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57  db, i, DB_ResetW
4690: 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  anted);.      }.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
46b0: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42  mDbFlags &= ~(DB
46c0: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
46d0: 65 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b  e|DBFLAG_SchemaK
46e0: 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74  nownOk);.  sqlit
46f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
4700: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
4710: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
4720: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ;.  if( db->nSch
4730: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4740: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
4750: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
4760: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
4770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4780: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
4790: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
47a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
47b0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
47c0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
47d0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
47e0: 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d  &= ~DBFLAG_Schem
47f0: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
4800: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4810: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4820: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4830: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4840: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4850: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4870: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4880: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4890: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
48a0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
48b0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
48c0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
48d0: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
48e0: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
48f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4900: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
4910: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
4920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4930: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
4940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4950: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
4960: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
4970: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4980: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
49a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
49b0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
49c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
49d0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
49e0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
49f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4a00: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4a10: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4a20: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4a30: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
4a40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
4a50: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4a60: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4a70: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4a80: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4a90: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4aa0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4ab0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4ac0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4ad0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4ae0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4af0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4b00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4b10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4b20: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4b30: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
4b40: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
4b50: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4b60: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4b80: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4b90: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4ba0: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4bb0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4bc0: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4bd0: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4be0: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4bf0: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4c00: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4c10: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4c20: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4c30: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
4c40: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
4c50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4c60: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
4c70: 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73  NE deleteTable(s
4c80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4c90: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4ca0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4cb0: 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ext;..#ifdef SQL
4cc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52  ITE_DEBUG.  /* R
4cd0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ce0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4cf0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4d00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4d10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4d20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4d30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4d40: 2e 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54  . Since schema T
4d50: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65  ables do not use
4d60: 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c  .  ** lookaside,
4d70: 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f   this number sho
4d80: 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  uld not change. 
4d90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6d 61  .  **.  ** If ma
4da0: 6c 6c 6f 63 20 68 61 73 20 61 6c 72 65 61 64 79  lloc has already
4db0: 20 66 61 69 6c 65 64 2c 20 69 74 20 6d 61 79 20   failed, it may 
4dc0: 62 65 20 74 68 61 74 20 69 74 20 66 61 69 6c 65  be that it faile
4dd0: 64 20 77 68 69 6c 65 20 61 6c 6c 6f 63 61 74 69  d while allocati
4de0: 6e 67 0a 20 20 2a 2a 20 61 20 54 61 62 6c 65 20  ng.  ** a Table 
4df0: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61 73 20  object that was 
4e00: 67 6f 69 6e 67 20 74 6f 20 62 65 20 6d 61 72 6b  going to be mark
4e10: 65 64 20 65 70 68 65 6d 65 72 61 6c 2e 20 53 6f  ed ephemeral. So
4e20: 20 64 6f 20 6e 6f 74 20 63 68 65 63 6b 0a 20 20   do not check.  
4e30: 2a 2a 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  ** that no looka
4e40: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
4e50: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
4e60: 20 65 69 74 68 65 72 2e 20 2a 2f 0a 20 20 69 6e   either. */.  in
4e70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4e80: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 64  ;.  if( db && !d
4e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4ea0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
4eb0: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4ec0: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
4ed0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
4ee0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
4ef0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
4f00: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
4f10: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4f20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4f30: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4f40: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4f50: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4f60: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4f70: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4f80: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4f90: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4fa0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4fb0: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4fc0: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4fd0: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4fe0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4ff0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
5000: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
5010: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
5020: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5030: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
5040: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
5050: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
5060: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
5070: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
5080: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
5090: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
50a0: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
50b0: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
50c0: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
50d0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
50e0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
50f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5100: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
5110: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
5120: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
5130: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
5140: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
5150: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
5160: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
5170: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
5180: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
5190: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
51a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
51b0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
51c0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
51d0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
51e0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
51f0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
5200: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
5210: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
5220: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5230: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5240: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5250: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5260: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5270: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5280: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5290: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
52a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
52b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
52c0: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
52e0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
52f0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
5300: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
5310: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5320: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
5330: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5340: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5350: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5360: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5370: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5380: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5390: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
53a0: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
53b0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
53c0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
53d0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
53e0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
53f0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
5400: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
5410: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
5420: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
5430: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5450: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5460: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5470: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5480: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5490: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
54a0: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
54b0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
54c0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
54d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
54e0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
54f0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
5500: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
5510: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
5520: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
5530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5540: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5550: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5560: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5570: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5580: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5590: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
55a0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
55b0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
55c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
55d0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
55e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
55f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5600: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5610: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
5620: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
5630: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5640: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5650: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5660: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5670: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5680: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5690: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
56a0: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
56b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
56c0: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
56d0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
56e0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
56f0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
5700: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
5710: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
5720: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
5730: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5740: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5750: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5760: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5770: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5780: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5790: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
57a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
57b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
57c0: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
57d0: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
57e0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
57f0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
5800: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
5810: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5820: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
5830: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5840: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5850: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5860: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5870: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5880: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5890: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
58a0: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
58b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
58c0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
58d0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
58e0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
58f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
5900: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
5910: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5920: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
5930: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5940: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5950: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5960: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5970: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5980: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5990: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
59a0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
59b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59c0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
59d0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
59e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
59f0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
5a00: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
5a10: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
5a20: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
5a30: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5a40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5a50: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5a60: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5a70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5a80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5a90: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5aa0: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5ab0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5ac0: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5ae0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5af0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5b00: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5b10: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5b20: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
5b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5b40: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5b50: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5b60: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5b70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5b80: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5b90: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5ba0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5bb0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5bc0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5bd0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5be0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5bf0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c00: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5c10: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5c20: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
5c30: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5c40: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5c50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5c60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5c70: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5c80: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5c90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5ca0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5cb0: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5cc0: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5cd0: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5ce0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5cf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5d00: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5d10: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5d20: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5d30: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5d40: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5d50: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5d60: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5d70: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5d80: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5d90: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5da0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5db0: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5dc0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5dd0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5de0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5df0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5e00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5e10: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5e20: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5e30: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5e40: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5e50: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5e60: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5e70: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5e80: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5e90: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5ea0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5eb0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5ec0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5ed0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ee0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5ef0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5f00: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5f10: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5f20: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5f30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5f60: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5f70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f90: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5fa0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5fb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5fc0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5fd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5fe0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5ff0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
6000: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6010: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
6020: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
6030: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
6040: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
6050: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
6060: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
6070: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
6080: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
6090: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
60a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
60b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
60c0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
60d0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
60e0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
60f0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6100: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6110: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6120: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
6130: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
6140: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6150: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
6160: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
6170: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
6180: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6190: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
61a0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
61c0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
61d0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
61e0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
61f0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
6200: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6210: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6220: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
6230: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6240: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6250: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6260: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6270: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6280: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6290: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
62a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
62b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
62d0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
62e0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
62f0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
6300: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
6310: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
6320: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
6330: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6340: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6350: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6360: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6370: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6380: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
63a0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
63b0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
63c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
63d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
63e0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
63f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
6400: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
6410: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
6420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6430: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6440: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6450: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6470: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6480: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6490: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
64a0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
64b0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
64c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
64d0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
64e0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
64f0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
6500: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
6510: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6520: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6530: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6540: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6550: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6560: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6570: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6580: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6590: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
65a0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
65b0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
65c0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
65d0: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41  *.** True if PRA
65e0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
65f0: 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74  ema is ON.*/.int
6600: 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
6610: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
6620: 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  db){.  testcase(
6630: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6640: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6650: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6660: 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  ))==0 );.  testc
6670: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6680: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6690: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
66a0: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
66b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
66c0: 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20  riteSchema );.  
66d0: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
66e0: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
66f0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6700: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
6720: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b  ITE_Defensive );
6730: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6740: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6750: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6760: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6780: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6790: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
67a0: 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72  sive) );.  retur
67b0: 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  n (db->flags&(SQ
67c0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
67d0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
67e0: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74  e))==SQLITE_Writ
67f0: 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eSchema;.}../*.*
6800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6810: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
6820: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
6830: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
6840: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
6850: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
6860: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6870: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6880: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6890: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
68a0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
68b0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
68c0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
68d0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
68e0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
68f0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6900: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
6910: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
6920: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
6930: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2a  internal use..**
6940: 0a 2a 2a 20 57 68 65 6e 20 70 61 72 73 69 6e 67  .** When parsing
6950: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6960: 65 72 20 74 61 62 6c 65 2c 20 74 68 69 73 20 72  er table, this r
6970: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 63 68 65 63  outine also chec
6980: 6b 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  ks to.** make su
6990: 72 65 20 74 68 65 20 22 74 79 70 65 22 2c 20 22  re the "type", "
69a0: 6e 61 6d 65 22 2c 20 61 6e 64 20 22 74 62 6c 5f  name", and "tbl_
69b0: 6e 61 6d 65 22 20 63 6f 6c 75 6d 6e 73 20 61 72  name" columns ar
69c0: 65 20 63 6f 6e 73 69 73 74 65 6e 74 0a 2a 2a 20  e consistent.** 
69d0: 77 69 74 68 20 74 68 65 20 53 51 4c 2e 0a 2a 2f  with the SQL..*/
69e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
69f0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 0a 20 20 50  kObjectName(.  P
6a00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6a20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6a40: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
6a50: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  me of the object
6a60: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63   to check */.  c
6a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6a80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65  ,        /* Type
6a90: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6aa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6ab0: 2a 7a 54 62 6c 4e 61 6d 65 20 20 20 20 20 20 2f  *zTblName      /
6ac0: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  * Parent table n
6ad0: 61 6d 65 20 66 6f 72 20 74 72 69 67 67 65 72 73  ame for triggers
6ae0: 20 61 6e 64 20 69 6e 64 65 78 65 73 20 2a 2f 0a   and indexes */.
6af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6b00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6b10: 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74   if( sqlite3Writ
6b20: 61 62 6c 65 53 63 68 65 6d 61 28 64 62 29 20 7c  ableSchema(db) |
6b30: 7c 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  | db->init.impos
6b40: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
6b50: 2f 2a 20 53 6b 69 70 20 74 68 65 73 65 20 65 72  /* Skip these er
6b60: 72 6f 72 20 63 68 65 63 6b 73 20 66 6f 72 20 77  ror checks for w
6b70: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
6b80: 4e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  N */.    return 
6b90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6ba0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6bb0: 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  sy ){.    if( sq
6bc0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
6bd0: 79 70 65 2c 20 64 62 2d 3e 69 6e 69 74 2e 61 7a  ype, db->init.az
6be0: 49 6e 69 74 5b 30 5d 29 0a 20 20 20 20 20 7c 7c  Init[0]).     ||
6bf0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
6c00: 28 7a 4e 61 6d 65 2c 20 64 62 2d 3e 69 6e 69 74  (zName, db->init
6c10: 2e 61 7a 49 6e 69 74 5b 31 5d 29 0a 20 20 20 20  .azInit[1]).    
6c20: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
6c30: 63 6d 70 28 7a 54 62 6c 4e 61 6d 65 2c 20 64 62  cmp(zTblName, db
6c40: 2d 3e 69 6e 69 74 2e 61 7a 49 6e 69 74 5b 32 5d  ->init.azInit[2]
6c50: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
6c60: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
6c70: 2e 62 45 78 74 72 61 53 63 68 65 6d 61 43 68 65  .bExtraSchemaChe
6c80: 63 6b 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  cks ){.        s
6c90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6ca0: 50 61 72 73 65 2c 20 22 22 29 3b 20 2f 2a 20 63  Parse, ""); /* c
6cb0: 6f 72 72 75 70 74 53 63 68 65 6d 61 28 29 20 77  orruptSchema() w
6cc0: 69 6c 6c 20 73 75 70 70 6c 79 20 74 68 65 20 65  ill supply the e
6cd0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
6ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
6cf0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6d00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6d10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
6d20: 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 30  ed==0 .     && 0
6d30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6d40: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6d50: 5f 22 2c 20 37 29 0a 20 20 20 20 29 7b 0a 20 20  _", 7).    ){.  
6d60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6d70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
6d80: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
6d90: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6da0: 73 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  se: %s",.       
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
6dc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
6dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6e10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
6e20: 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
6e30: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
6e40: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
6e50: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  x(Table *pTab){.
6e60: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f    Index *p;.  fo
6e70: 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  r(p=pTab->pIndex
6e80: 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72  ; p && !IsPrimar
6e90: 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d  yKeyIndex(p); p=
6ea0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65  p->pNext){}.  re
6eb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6ec0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 72 75 65   Return the true
6ed0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   column number o
6ee0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
6ef0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
6f00: 20 74 61 62 6c 65 0a 2a 2a 20 74 72 75 65 20 63   table.** true c
6f10: 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74  olumn iCol.  Ret
6f20: 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f  urn -1 if not fo
6f30: 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69  und..*/.i16 sqli
6f40: 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78  te3ColumnOfIndex
6f50: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31  (Index *pIdx, i1
6f60: 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  6 iCol){.  int i
6f70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6f80: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
6f90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  +){.    if( iCol
6fa0: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
6fb0: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  [i] ) return i;.
6fc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
6fd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6fe0: 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45  TE_OMIT_GENERATE
6ff0: 44 5f 43 4f 4c 55 4d 4e 53 0a 2f 2a 20 43 6f 6e  D_COLUMNS./* Con
7000: 76 65 72 74 20 61 20 73 74 6f 72 61 67 65 20 63  vert a storage c
7010: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 74  olumn number int
7020: 6f 20 61 20 74 72 75 65 20 63 6f 6c 75 6d 6e 20  o a true column 
7030: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  number..**.** Th
7040: 65 20 73 74 6f 72 61 67 65 20 63 6f 6c 75 6d 6e  e storage column
7050: 20 6e 75 6d 62 65 72 20 28 30 2c 31 2c 32 2c 2e   number (0,1,2,.
7060: 2e 2e 2e 29 20 69 73 20 74 68 65 20 69 6e 64 65  ...) is the inde
7070: 78 20 6f 66 20 74 68 65 20 76 61 6c 75 65 0a 2a  x of the value.*
7080: 2a 20 61 73 20 69 74 20 61 70 70 65 61 72 73 20  * as it appears 
7090: 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  in the record on
70a0: 20 64 69 73 6b 2e 20 20 54 68 65 20 74 72 75 65   disk.  The true
70b0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 0a 2a   column number.*
70c0: 2a 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 28  * is the index (
70d0: 30 2c 31 2c 32 2c 2e 2e 2e 29 20 6f 66 20 74 68  0,1,2,...) of th
70e0: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
70f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7100: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
7110: 65 20 73 74 6f 72 61 67 65 20 63 6f 6c 75 6d 6e  e storage column
7120: 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
7130: 74 68 61 6e 20 74 68 65 20 74 72 75 65 20 63 6f  than the true co
7140: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 66 0a 2a  lumn number if.*
7150: 2a 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 72 65  * and only there
7160: 20 61 72 65 20 76 69 72 74 75 61 6c 20 63 6f 6c   are virtual col
7170: 75 6d 6e 73 20 74 6f 20 74 68 65 20 6c 65 66 74  umns to the left
7180: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
7190: 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44  E_OMIT_GENERATED
71a0: 5f 43 4f 4c 55 4d 4e 53 2c 20 74 68 69 73 20 72  _COLUMNS, this r
71b0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
71c0: 70 20 6d 61 63 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  p macro..**.** T
71d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
71e0: 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 73  the inverse of s
71f0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 54 61  qlite3ColumnOfTa
7200: 62 6c 65 28 29 2e 0a 2a 2f 0a 69 31 36 20 73 71  ble()..*/.i16 sq
7210: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 53 74 6f  lite3ColumnOfSto
7220: 72 61 67 65 28 54 61 62 6c 65 20 2a 70 54 61 62  rage(Table *pTab
7230: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
7240: 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
7250: 73 20 26 20 54 46 5f 48 61 73 56 69 72 74 75 61  s & TF_HasVirtua
7260: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  l ){.    int i;.
7270: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
7280: 69 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iCol; i++){.    
7290: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
72a0: 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  [i].colFlags & C
72b0: 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29  OLFLAG_VIRTUAL )
72c0: 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCol++;.    }. 
72d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 43 6f 6c   }.  return iCol
72e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
72f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7300: 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e  GENERATED_COLUMN
7310: 53 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 74  S./* Convert a t
7320: 72 75 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  rue column numbe
7330: 72 20 69 6e 74 6f 20 61 20 73 74 6f 72 61 67 65  r into a storage
7340: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a   column number..
7350: 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f 72 61 67  **.** The storag
7360: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
7370: 28 30 2c 31 2c 32 2c 2e 2e 2e 2e 29 20 69 73 20  (0,1,2,....) is 
7380: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
7390: 20 76 61 6c 75 65 0a 2a 2a 20 61 73 20 69 74 20   value.** as it 
73a0: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 72  appears in the r
73b0: 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b 2e 20 20  ecord on disk.  
73c0: 54 68 65 20 74 72 75 65 20 63 6f 6c 75 6d 6e 20  The true column 
73d0: 6e 75 6d 62 65 72 0a 2a 2a 20 69 73 20 74 68 65  number.** is the
73e0: 20 69 6e 64 65 78 20 28 30 2c 31 2c 32 2c 2e 2e   index (0,1,2,..
73f0: 2e 29 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  .) of the column
7400: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
7410: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
7420: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
7430: 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f 43  OMIT_GENERATED_C
7440: 4f 4c 55 4d 4e 53 2c 20 74 68 69 73 20 72 6f 75  OLUMNS, this rou
7450: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
7460: 6d 61 63 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  macro..**.** Thi
7470: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
7480: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 73 71 6c  e inverse of sql
7490: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 53 74 6f 72  ite3ColumnOfStor
74a0: 61 67 65 28 29 2e 0a 2a 2f 0a 69 31 36 20 73 71  age()..*/.i16 sq
74b0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 54 61 62  lite3ColumnOfTab
74c0: 6c 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  le(Table *pTab, 
74d0: 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74  i16 iCol){.  int
74e0: 20 69 3b 0a 20 20 69 31 36 20 6e 3b 0a 20 20 61   i;.  i16 n;.  a
74f0: 73 73 65 72 74 28 20 69 43 6f 6c 3c 70 54 61 62  ssert( iCol<pTab
7500: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 69 66 28 20  ->nCol );.  if( 
7510: 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
7520: 26 20 54 46 5f 48 61 73 56 69 72 74 75 61 6c 29  & TF_HasVirtual)
7530: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 43 6f  ==0 ) return iCo
7540: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d  l;.  for(i=0, n=
7550: 30 3b 20 69 3c 69 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<iCol; i++){
7560: 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
7570: 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73  aCol[i].colFlags
7580: 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55   & COLFLAG_VIRTU
7590: 41 4c 29 3d 3d 30 20 29 20 6e 2b 2b 3b 0a 20 20  AL)==0 ) n++;.  
75a0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 20 20 20  }.  return n;   
75b0: 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   .}.#endif../*.*
75c0: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
75d0: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
75e0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
75f0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
7600: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
7610: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
7620: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
7630: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
7640: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
7650: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
7660: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
7670: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
7680: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
7690: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
76a0: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
76b0: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
76c0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
76d0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
76e0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
76f0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
7700: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
7710: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
7720: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
7730: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
7740: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7750: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
7760: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
7770: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
7780: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
7790: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
77a0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
77b0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
77c0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
77d0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
77e0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
77f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7800: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
7810: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
7820: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
7830: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
7840: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
7850: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
7860: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
7870: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
7880: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
7890: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
78a0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
78b0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
78c0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
78d0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
78e0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
78f0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
7900: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
7910: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
7920: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
7930: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
7940: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
7950: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7960: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
7970: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
7980: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
7990: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
79a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
79b0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
79c0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
79d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
79e0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
79f0: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
7a00: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
7a10: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
7a20: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
7a30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
7a40: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
7a50: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
7a60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
7a70: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
7a80: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
7a90: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
7aa0: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
7ab0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
7ac0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
7ad0: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
7ae0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
7af0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
7b00: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
7b10: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7b20: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
7b30: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
7b40: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7b50: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
7b60: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
7b70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
7b80: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
7b90: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
7ba0: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
7bb0: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  */..  if( db->in
7bc0: 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69  it.busy && db->i
7bd0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29  nit.newTnum==1 )
7be0: 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c  {.    /* Special
7bf0: 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20   case:  Parsing 
7c00: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7c10: 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  r or sqlite_temp
7c20: 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a  _master schema *
7c30: 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  /.    iDb = db->
7c40: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e  init.iDb;.    zN
7c50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7c60: 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41  trDup(db, SCHEMA
7c70: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
7c80: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
7c90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
7ca0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
7cb0: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
7cc0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
7cd0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
7ce0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
7cf0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
7d00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
7d10: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7d20: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
7d30: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
7d40: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =1 ){.      /* I
7d50: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
7d60: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
7d70: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
7d80: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
7d90: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
7da0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
7db0: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
7dc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7dd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7de0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
7df0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
7e00: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
7e10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
7e20: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
7e30: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
7e40: 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e   iDb = 1;.    zN
7e50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
7e60: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7e70: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49  Name);.    if( I
7e80: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
7e90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7ea0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
7eb0: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e  Parse, (void*)zN
7ec0: 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ame, pName);.   
7ed0: 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
7ee0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
7ef0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Name;.  if( zNam
7f00: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
7f10: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
7f20: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
7f30: 73 65 2c 20 7a 4e 61 6d 65 2c 20 69 73 56 69 65  se, zName, isVie
7f40: 77 3f 22 76 69 65 77 22 3a 22 74 61 62 6c 65 22  w?"view":"table"
7f50: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
7f60: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7f70: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
7f80: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
7f90: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
7fa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7fb0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
7fc0: 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65  N.  assert( isTe
7fd0: 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d  mp==0 || isTemp=
7fe0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
7ff0: 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56  isView==0 || isV
8000: 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20  iew==1 );.  {.  
8010: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
8020: 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  8 aCode[] = {.  
8030: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
8040: 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  TE_TABLE,.      
8050: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
8060: 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  EMP_TABLE,.     
8070: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
8080: 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c  VIEW,.       SQL
8090: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
80a0: 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20  VIEW.    };.    
80b0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
80c0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
80d0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
80e0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
80f0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
8100: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
8110: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
8120: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
8130: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8150: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
8160: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
8170: 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64  Parse, (int)aCod
8180: 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65  e[isTemp+2*isVie
8190: 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  w],.            
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
81c0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
81d0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
81e0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
81f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
8200: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
8210: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
8220: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
8230: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
8240: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
8250: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
8260: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
8270: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
8280: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
8290: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
82a0: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
82b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
82c0: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
82d0: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
82e0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
82f0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
8300: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
8310: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
8320: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
8330: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
8340: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
8350: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
8360: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
8370: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
8380: 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52   !IN_SPECIAL_PAR
8390: 53 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  SE ){.    char *
83a0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
83b0: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
83c0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
83d0: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
83e0: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
83f0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
8400: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
8410: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
8420: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
8430: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
8440: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
8450: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
8460: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
8470: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8480: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
8490: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
84a0: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
84b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
84c0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
84d0: 62 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f  busy || CORRUPT_
84e0: 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DB );.        sq
84f0: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
8500: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
8510: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
8520: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
8530: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
8540: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
8550: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
8560: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
8570: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8580: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
8590: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
85a0: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
85b0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
85c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
85d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
85e0: 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73   }..  pTable = s
85f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8600: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
8610: 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
8620: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ble==0 ){.    as
8630: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
8640: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50  Failed );.    pP
8650: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
8660: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
8670: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
8680: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
8690: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
86a0: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
86b0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
86c0: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
86d0: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
86e0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
86f0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
8700: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  ble->nTabRef = 1
8710: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8720: 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20  DEFAULT_ROWEST. 
8730: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
8740: 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
8750: 45 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  Est(SQLITE_DEFAU
8760: 4c 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73  LT_ROWEST);.#els
8770: 65 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  e.  pTable->nRow
8780: 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
8790: 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
87a0: 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
87b0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
87c0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
87d0: 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  ewTable==0 );.  
87e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
87f0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
8800: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
8810: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
8820: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
8830: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
8840: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
8850: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
8860: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
8870: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
8880: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
8890: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
88a0: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
88b0: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
88c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
88d0: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
88e0: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
88f0: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
8900: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
8910: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
8920: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
8930: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
8940: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
8950: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
8960: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
8970: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
8980: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
8990: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
89a0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
89b0: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
89c0: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
89d0: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
89e0: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
89f0: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
8a00: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
8a10: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
8a20: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
8a30: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
8a40: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
8a50: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
8a60: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
8a70: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
8a80: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
8a90: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
8aa0: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
8ab0: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
8ac0: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
8ad0: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
8ae0: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
8af0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
8b00: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
8b10: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
8b20: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
8b30: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
8b40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
8b50: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
8b60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8b70: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
8b80: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  .    int addr1;.
8b90: 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d      int fileForm
8ba0: 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31  at;.    int reg1
8bb0: 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20  , reg2, reg3;.  
8bc0: 20 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69    /* nullRow[] i
8bd0: 73 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65  s an OP_Record e
8be0: 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77  ncoding of a row
8bf0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55   containing 5 NU
8c00: 4c 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  LLs */.    stati
8c10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c  c const char nul
8c20: 6c 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c  lRow[] = { 6, 0,
8c30: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
8c40: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
8c50: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
8c60: 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
8c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8c80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8c90: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
8ca0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
8cc0: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
8cd0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
8ce0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
8cf0: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
8d00: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
8d10: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
8d20: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
8d30: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
8d40: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
8d50: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
8d60: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8d70: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
8d80: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
8d90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8da0: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
8db0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
8dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8dd0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
8de0: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
8df0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
8e00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
8e10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
8e20: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
8e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
8e40: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20  , OP_If, reg3); 
8e50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8e60: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
8e70: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8e80: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
8e90: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
8eb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
8ec0: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
8ed0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8ee0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
8ef0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
8f00: 4f 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61  ORMAT, fileForma
8f10: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
8f20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8f30: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
8f40: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
8f50: 49 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20  ING, ENC(db));. 
8f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
8f70: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
8f80: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
8f90: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
8fa0: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
8fb0: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
8fc0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
8fd0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
8fe0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
8ff0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
9000: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
9010: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
9020: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
9030: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
9040: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
9050: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
9060: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
9070: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
9080: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
9090: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
90a0: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
90b0: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
90c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
90d0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
90e0: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
90f0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
9100: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
9110: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
9120: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
9130: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
9140: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
9150: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
9160: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
9170: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9180: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
9190: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
91a0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
91b0: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
91c0: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
91d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
91e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
91f0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
9200: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
9210: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
9220: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
9230: 54 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73  Tab =.         s
9240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9250: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72  (v, OP_CreateBtr
9260: 65 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42  ee, iDb, reg2, B
9270: 54 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20  TREE_INTKEY);.  
9280: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
9290: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
92a0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
92b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
92c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
92d0: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
92e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
92f0: 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36  p4(v, OP_Blob, 6
9300: 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52  , reg3, 0, nullR
9310: 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  ow, P4_STATIC);.
9320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9330: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
9340: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
9350: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
9360: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
9370: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
9380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9390: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
93a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
93b0: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
93c0: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
93d0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
93e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
93f0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
9400: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
9410: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
9420: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
9430: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
9440: 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20  t properties of 
9450: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62  a table column b
9460: 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67  ased on the (mag
9470: 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66  ical).** name of
9480: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a   the column..*/.
9490: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
94a0: 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53  E_HIDDEN_COLUMNS
94b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c  .void sqlite3Col
94c0: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
94d0: 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61  mName(Table *pTa
94e0: 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29  b, Column *pCol)
94f0: 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  {.  if( sqlite3_
9500: 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a  strnicmp(pCol->z
9510: 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f  Name, "__hidden_
9520: 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20  _", 10)==0 ){.  
9530: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
9540: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44   |= COLFLAG_HIDD
9550: 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
9560: 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54  pTab && pCol!=pT
9570: 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f  ab->aCol && (pCo
9580: 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  l[-1].colFlags &
9590: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29   COLFLAG_HIDDEN)
95a0: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   ){.    pTab->ta
95b0: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f  bFlags |= TF_OOO
95c0: 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65  Hidden;.  }.}.#e
95d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
95e0: 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f   a new column to
95f0: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
9600: 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
9610: 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ructed..**.** Th
9620: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
9630: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65  his routine once
9640: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
9650: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20   declaration.** 
9660: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
9670: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71  E statement.  sq
9680: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
9690: 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a  ) gets called.**
96a0: 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68   first to get th
96b0: 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65  ings going.  The
96c0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
96d0: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63  s called for eac
96e0: 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  h.** column..*/.
96f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
9700: 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61  olumn(Parse *pPa
9710: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
9720: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
9730: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9740: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
9750: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  ;.  char *zType;
9760: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
9790: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
97a0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
97b0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
97c0: 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d  >nCol+1>db->aLim
97d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
97e0: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
97f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9800: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
9810: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c   columns on %s",
9820: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
9830: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20  return;.  }.  z 
9840: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9850: 63 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  cRaw(db, pName->
9860: 6e 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32  n + pType->n + 2
9870: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
9880: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e  return;.  if( IN
9890: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
98a0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
98b0: 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
98c0: 76 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b  void*)z, pName);
98d0: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61  .  memcpy(z, pNa
98e0: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
98f0: 3b 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20  ;.  z[pName->n] 
9900: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  = 0;.  sqlite3De
9910: 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28  quote(z);.  for(
9920: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
9930: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
9940: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c  lite3_stricmp(z,
9950: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
9960: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
9970: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9980: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
9990: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
99a0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
99b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
99c0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
99d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
99e0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
99f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
9a00: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
9a10: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
9a20: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
9a30: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
9a40: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
9a50: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
9a60: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
9a70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
9a80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
9a90: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
9aa0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
9ab0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
9ac0: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
9ad0: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
9ae0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
9af0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
9b00: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  z;.  sqlite3Colu
9b10: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
9b20: 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20  Name(p, pCol);. 
9b30: 0a 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d  .  if( pType->n=
9b40: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
9b50: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
9b60: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
9b70: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
9b80: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
9b90: 20 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68    ** 'BLOB' with
9ba0: 20 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20   a default size 
9bb0: 6f 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  of 4 bytes. */. 
9bc0: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
9bd0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
9be0: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73  LOB;.    pCol->s
9bf0: 7a 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66  zEst = 1;.#ifdef
9c00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
9c10: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
9c20: 0a 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69  .    if( 4>=sqli
9c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
9c40: 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  szSorterRef ){. 
9c50: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
9c60: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53  ags |= COLFLAG_S
9c70: 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a  ORTERREF;.    }.
9c80: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
9c90: 20 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20      zType = z + 
9ca0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9cb0: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63  z) + 1;.    memc
9cc0: 70 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d  py(zType, pType-
9cd0: 3e 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20  >z, pType->n);. 
9ce0: 20 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e     zType[pType->
9cf0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  n] = 0;.    sqli
9d00: 74 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65  te3Dequote(zType
9d10: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  );.    pCol->aff
9d20: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
9d30: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
9d40: 65 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43  e, pCol);.    pC
9d50: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
9d60: 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b  COLFLAG_HASTYPE;
9d70: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  .  }.  p->nCol++
9d80: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  ;.  pParse->cons
9d90: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30  traintName.n = 0
9da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9db0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9dc0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
9dd0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
9de0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
9df0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
9e00: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
9e10: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
9e20: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
9e30: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
9e40: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
9e50: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
9e60: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
9e70: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9e80: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9e90: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9ea0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
9eb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
9ec0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
9ed0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
9ee0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70  n *pCol;.  p = p
9ef0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9f00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
9f10: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
9f20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
9f30: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9f40: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d  nCol-1];.  pCol-
9f50: 3e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  >notNull = (u8)o
9f60: 6e 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62  nError;.  p->tab
9f70: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e  Flags |= TF_HasN
9f80: 6f 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65  otNull;..  /* Se
9f90: 74 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c  t the uniqNotNul
9fa0: 6c 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e  l flag on any UN
9fb0: 49 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78  IQUE or PK index
9fc0: 65 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  es already creat
9fd0: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  ed.  ** on this 
9fe0: 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66  column.  */.  if
9ff0: 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73  ( pCol->colFlags
a000: 20 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55   & COLFLAG_UNIQU
a010: 45 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  E ){.    Index *
a020: 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
a030: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
a040: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
a050: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
a060: 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ert( pIdx->nKeyC
a070: 6f 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f  ol==1 && pIdx->o
a080: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
a090: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
a0a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
a0b0: 70 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  p->nCol-1 ){.   
a0c0: 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
a0d0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  otNull = 1;.    
a0e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
a0f0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
a100: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
a110: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
a120: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
a130: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
a140: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
a150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
a160: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
a170: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
a180: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
a190: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
a1a0: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
a1b0: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
a1c0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
a1d0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
a1e0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
a1f0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
a200: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
a210: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
a220: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
a230: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
a240: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
a250: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
a260: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
a270: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
a280: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
a290: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
a2a0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
a2b0: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
a2c0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
a2d0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
a2e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
a2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a300: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
a310: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
a320: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
a330: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
a340: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
a350: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
a360: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
a370: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
a380: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
a390: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
a3a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42    | SQLITE_AFF_B
a3b0: 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  LOB.** 'REAL'   
a3c0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
a3d0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
a3e0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
a3f0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
a400: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
a410: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
a420: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
a430: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
a440: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
a450: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
a460: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
a470: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
a480: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
a490: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
a4a0: 63 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d  char *zIn, Colum
a4b0: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20  n *pCol){.  u32 
a4c0: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
a4d0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
a4e0: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
a4f0: 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b  char *zChar = 0;
a500: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21  ..  assert( zIn!
a510: 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a  =0 );.  while( z
a520: 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d  In[0] ){.    h =
a530: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
a540: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a  3UpperToLower[(*
a550: 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20  zIn)&0xff];.    
a560: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
a570: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
a580: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
a590: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
a5a0: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
a5b0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a5c0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
a5d0: 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20    zChar = zIn;. 
a5e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
a5f0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
a600: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
a610: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
a620: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
a630: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
a640: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
a650: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
a660: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
a670: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
a680: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
a690: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
a6a0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
a6b0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
a6c0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
a6d0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
a6e0: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
a6f0: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
a700: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
a710: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
a720: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
a730: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
a740: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
a750: 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d      if( zIn[0]==
a760: 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49  '(' ) zChar = zI
a770: 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
a780: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
a790: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
a7a0: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
a7b0: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
a7c0: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
a7d0: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
a7e0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
a7f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
a800: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
a810: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
a820: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
a830: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
a840: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
a850: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
a860: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
a870: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
a880: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
a890: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
a8a0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
a8b0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
a8c0: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
a8d0: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
a8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
a8f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
a900: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
a910: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
a920: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
a930: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
a940: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
a950: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
a960: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
a970: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
a980: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
a990: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
a9a0: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
a9b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a9c0: 2a 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74  * If pCol is not
a9d0: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
a9e0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
a9f0: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
aa00: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
aa10: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
aa20: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
aa30: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
aa40: 2f 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a  /.  if( pCol ){.
aa50: 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20      int v = 0;  
aa60: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
aa70: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
aa80: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
aa90: 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  f<SQLITE_AFF_NUM
aaa0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66  ERIC ){.      if
aab0: 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20  ( zChar ){.     
aac0: 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b     while( zChar[
aad0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
aae0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  if( sqlite3Isdig
aaf0: 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a  it(zChar[0]) ){.
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ab10: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
ab20: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
ab30: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
ab40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
ab50: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
ab60: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
ab70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
ab80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
ab90: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
aba0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
abb0: 20 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f       v = 16;   /
abc0: 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c  * BLOB, TEXT, CL
abd0: 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72  OB -> r=5  (appr
abe0: 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20  ox 20 bytes)*/. 
abf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
ac00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ac10: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
ac20: 43 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73  CES.    if( v>=s
ac30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
ac40: 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29  ig.szSorterRef )
ac50: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  {.      pCol->co
ac60: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
ac70: 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20  G_SORTERREF;.   
ac80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20   }.#endif.    v 
ac90: 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69  = v/4 + 1;.    i
aca0: 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32  f( v>255 ) v = 2
acb0: 35 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  55;.    pCol->sz
acc0: 45 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  Est = v;.  }.  r
acd0: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
ace0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
acf0: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
ad00: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
ad10: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
ad20: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
ad30: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
ad40: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
ad50: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
ad60: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
ad70: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
ad80: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
ad90: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
ada0: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
adb0: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
adc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
add0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
ade0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
adf0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
ae00: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
ae10: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ae20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ae30: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
ae40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ae50: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
ae60: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ae70: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
ae80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ae90: 20 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72   The parsed expr
aea0: 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65  ession of the de
aeb0: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20  fault value */. 
aec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
aed0: 61 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61  art,      /* Sta
aee0: 72 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  rt of the defaul
aef0: 74 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a  t value text */.
af00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
af10: 6e 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  nd         /* Fi
af20: 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61  rst character pa
af30: 73 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74  st end of defaut
af40: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29   value text */.)
af50: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
af60: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
af70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
af80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
af90: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
afa0: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
afb0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
afc0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
afd0: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
afe0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
aff0: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70  tOrFunction(pExp
b000: 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  r, db->init.busy
b010: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
b020: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b030: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
b040: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
b050: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
b060: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
b070: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
b080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
b090: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
b0a0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
b0b0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
b0c0: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
b0d0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
b0e0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
b0f0: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
b100: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b110: 45 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71  Expr x;.      sq
b120: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
b130: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
b140: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
b150: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
b160: 3b 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54  ;.      x.op = T
b170: 4b 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e  K_SPAN;.      x.
b180: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74  u.zToken = sqlit
b190: 65 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20  e3DbSpanDup(db, 
b1a0: 7a 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20  zStart, zEnd);. 
b1b0: 20 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70       x.pLeft = p
b1c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c  Expr;.      x.fl
b1d0: 61 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20  ags = EP_Skip;. 
b1e0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
b1f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b200: 70 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55  p(db, &x, EXPRDU
b210: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
b220: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b230: 62 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  b, x.u.zToken);.
b240: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b250: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
b260: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
b270: 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70  enameExprUnmap(p
b280: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
b290: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
b2a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
b2b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b  );.}../*.** Back
b2c0: 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c  wards Compatibil
b2d0: 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a  ity Hack:.** .**
b2e0: 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73   Historical vers
b2f0: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
b300: 63 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20  ccepted strings 
b310: 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  as column names 
b320: 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e  in.** indexes an
b330: 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  d PRIMARY KEY co
b340: 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e  nstraints and in
b350: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
b360: 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  nts.  Example:.*
b370: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
b380: 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c  TABLE xyz(a,b,c,
b390: 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28  d,e,PRIMARY KEY(
b3a0: 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c  'a'),UNIQUE('b',
b3b0: 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d  'c' COLLATE trim
b3c0: 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  ).**     CREATE 
b3d0: 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a  INDEX abc ON xyz
b3e0: 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65  ('c','d' DESC,'e
b3f0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
b400: 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68   DESC);.**.** Th
b410: 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75  is is goofy.  Bu
b420: 74 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61  t to preserve ba
b430: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
b440: 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75  ility we continu
b450: 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69  e to.** accept i
b460: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
b470: 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73   does the necess
b480: 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20  ary conversion. 
b490: 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20   It converts.** 
b4a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67  the expression g
b4b0: 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75  iven in its argu
b4c0: 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53  ment from a TK_S
b4d0: 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f  TRING into a TK_
b4e0: 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70  ID.** if the exp
b4f0: 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20  ression is just 
b500: 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68  a TK_STRING with
b510: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c   an optional COL
b520: 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  LATE clause..** 
b530: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
b540: 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74  n is anything ot
b550: 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49  her than TK_STRI
b560: 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  NG, the expressi
b570: 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  on is.** unchang
b580: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
b590: 69 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67  id sqlite3String
b5a0: 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20  ToId(Expr *p){. 
b5b0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   if( p->op==TK_S
b5c0: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e  TRING ){.    p->
b5d0: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65  op = TK_ID;.  }e
b5e0: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
b5f0: 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e  K_COLLATE && p->
b600: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  pLeft->op==TK_ST
b610: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70  RING ){.    p->p
b620: 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44  Left->op = TK_ID
b630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
b640: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
b650: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
b660: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
b670: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
b680: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
b690: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
b6a0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
b6b0: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
b6c0: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
b6d0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
b6e0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
b6f0: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
b700: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
b710: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
b720: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
b730: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
b740: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
b750: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
b760: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
b770: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
b780: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
b790: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
b7a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
b7b0: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
b7c0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
b7d0: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
b7e0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
b7f0: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
b800: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
b810: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
b820: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
b830: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
b840: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
b850: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
b860: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
b870: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
b880: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
b890: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
b8a0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
b8b0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
b8c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b8d0: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
b8e0: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
b8f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b900: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
b910: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
b920: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
b930: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
b940: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
b950: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
b960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b970: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
b980: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b990: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b9a0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
b9b0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
b9c0: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
b9d0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
b9e0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
b9f0: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
ba00: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
ba10: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
ba20: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
ba30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ba40: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
ba50: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
ba60: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
ba70: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
ba80: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
ba90: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
baa0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
bab0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
bac0: 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d  ewTable;.  Colum
bad0: 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
bae0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
baf0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
bb00: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
bb10: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
bb20: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
bb30: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
bb40: 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a  asPrimaryKey ){.
bb50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bb60: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
bb70: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
bb80: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
bb90: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
bba0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
bbb0: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
bbc0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
bbd0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
bbe0: 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  = TF_HasPrimaryK
bbf0: 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  ey;.  if( pList=
bc00: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
bc10: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
bc20: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61  .    pCol = &pTa
bc30: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
bc40: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
bc50: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
bc60: 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20  MKEY;.    nTerm 
bc70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
bc80: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
bc90: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
bca0: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
bcb0: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
bcc0: 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
bcd0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
bce0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
bcf0: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
bd00: 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20  ( pCExpr!=0 );. 
bd10: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69       sqlite3Stri
bd20: 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a  ngToId(pCExpr);.
bd30: 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72        if( pCExpr
bd40: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
bd50: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
bd60: 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78  r *zCName = pCEx
bd70: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
bd80: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
bd90: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
bda0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
bdb0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
bdc0: 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c  3StrICmp(zCName,
bdd0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
bde0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
be00: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
be10: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ol];.           
be20: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
be30: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
be40: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY;.            
be50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
be60: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
be70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
be80: 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20   if( nTerm==1.  
be90: 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73   && pCol.   && s
bea0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71  qlite3StrICmp(sq
beb0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
bec0: 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47  pCol,""), "INTEG
bed0: 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f  ER")==0.   && so
bee0: 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f  rtOrder!=SQLITE_
bef0: 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20  SO_DESC.  ){.   
bf00: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
bf10: 42 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29  BJECT && pList )
bf20: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
bf30: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
bf40: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
bf50: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
bf60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
bf70: 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28  enameTokenRemap(
bf80: 70 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69  pParse, &pTab->i
bf90: 50 4b 65 79 2c 20 70 43 45 78 70 72 29 3b 0a 20  PKey, pCExpr);. 
bfa0: 20 20 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69     }.    pTab->i
bfb0: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
bfc0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
bfd0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
bfe0: 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e    assert( autoIn
bff0: 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d  c==0 || autoInc=
c000: 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  =1 );.    pTab->
c010: 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f  tabFlags |= auto
c020: 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65  Inc*TF_Autoincre
c030: 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ment;.    if( pL
c040: 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50  ist ) pParse->iP
c050: 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  kSortOrder = pLi
c060: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46 6c 61  st->a[0].sortFla
c070: 67 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  gs;.  }else if( 
c080: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
c090: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c0a0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
c0b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c0c0: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
c0d0: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
c0e0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
c0f0: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
c100: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
c110: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
c120: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
c130: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
c140: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
c150: 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20  Error, 0,.      
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65       0, sortOrde
c180: 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58  r, 0, SQLITE_IDX
c190: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29  TYPE_PRIMARYKEY)
c1a0: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
c1b0: 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65  .  }..primary_ke
c1c0: 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  y_exit:.  sqlite
c1d0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
c1e0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
c1f0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
c200: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
c210: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
c220: 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  t to the table c
c230: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
c240: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
c250: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
c260: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a  heckConstraint(.
c270: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c280: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c290: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c2a0: 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a   *pCheckExpr  /*
c2b0: 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65   The check expre
c2c0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ssion */.){.#ifn
c2d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c2e0: 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70  CHECK.  Table *p
c2f0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
c300: 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74  ewTable;.  sqlit
c310: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c320: 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20  >db;.  if( pTab 
c330: 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  && !IN_DECLARE_V
c340: 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74  TAB.   && !sqlit
c350: 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c  e3BtreeIsReadonl
c360: 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e  y(db->aDb[db->in
c370: 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29  it.iDb].pBt).  )
c380: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65  {.    pTab->pChe
c390: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
c3a0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
c3b0: 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c  e, pTab->pCheck,
c3c0: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
c3d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
c3e0: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29  nstraintName.n )
c3f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c400: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
c410: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
c420: 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f  eck, &pParse->co
c430: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29  nstraintName, 1)
c440: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
c450: 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
c460: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
c470: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68  (pParse->db, pCh
c480: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  eckExpr);.  }.}.
c490: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
c4a0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
c4b0: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
c4c0: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
c4d0: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
c4e0: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
c4f0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
c500: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
c510: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
c520: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
c530: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
c540: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43  nt i;.  char *zC
c550: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
c560: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
c570: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
c580: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71  sequence */.  sq
c590: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
c5a0: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
c5b0: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
c5c0: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
c5d0: 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70  nCol-1;.  db = p
c5e0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f  Parse->db;.  zCo
c5f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
c600: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
c610: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43  oken);.  if( !zC
c620: 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  oll ) return;.. 
c630: 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61   if( sqlite3Loca
c640: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
c650: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
c660: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
c670: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c680: 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  b, p->aCol[i].zC
c690: 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  oll);.    p->aCo
c6a0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f  l[i].zColl = zCo
c6b0: 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ll;.  .    /* If
c6c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
c6d0: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
c6e0: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
c6f0: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
c700: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
c710: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
c720: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
c730: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
c740: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
c750: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
c760: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
c770: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
c780: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
c790: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
c7a0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c7b0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
c7c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
c7d0: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a  ->nKeyCol==1 );.
c7e0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
c7f0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
c800: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
c810: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
c820: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
c830: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
c840: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
c850: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
c860: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 68 61  );.  }.}../* Cha
c870: 6e 67 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nge the most rec
c880: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 63 6f 6c  ently parsed col
c890: 75 6d 6e 20 74 6f 20 62 65 20 61 20 47 45 4e 45  umn to be a GENE
c8a0: 52 41 54 45 44 20 41 4c 57 41 59 53 20 41 53 0a  RATED ALWAYS AS.
c8b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
c8c0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 47 65 6e  id sqlite3AddGen
c8d0: 65 72 61 74 65 64 28 50 61 72 73 65 20 2a 70 50  erated(Parse *pP
c8e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
c8f0: 72 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  r, Token *pType)
c900: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
c910: 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f  _OMIT_GENERATED_
c920: 43 4f 4c 55 4d 4e 53 0a 20 20 75 38 20 65 54 79  COLUMNS.  u8 eTy
c930: 70 65 20 3d 20 43 4f 4c 46 4c 41 47 5f 56 49 52  pe = COLFLAG_VIR
c940: 54 55 41 4c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  TUAL;.  Table *p
c950: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
c960: 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d  ewTable;.  Colum
c970: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 49  n *pCol;.  if( I
c980: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
c990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
c9a0: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
c9b0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
c9c0: 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  }.  if( pTab==0 
c9d0: 29 20 67 6f 74 6f 20 67 65 6e 65 72 61 74 65 64  ) goto generated
c9e0: 5f 64 6f 6e 65 3b 0a 20 20 70 43 6f 6c 20 3d 20  _done;.  pCol = 
c9f0: 26 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  &(pTab->aCol[pTa
ca00: 62 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 69  b->nCol-1]);.  i
ca10: 66 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 29  f( pCol->pDflt )
ca20: 20 67 6f 74 6f 20 67 65 6e 65 72 61 74 65 64 5f   goto generated_
ca30: 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 54 79  error;.  if( pTy
ca40: 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  pe ){.    if( pT
ca50: 79 70 65 2d 3e 6e 3d 3d 37 20 26 26 20 73 71 6c  ype->n==7 && sql
ca60: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 22 76 69  ite3StrNICmp("vi
ca70: 72 74 75 61 6c 22 2c 70 54 79 70 65 2d 3e 7a 2c  rtual",pType->z,
ca80: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  7)==0 ){.      /
ca90: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
caa0: 65 6c 73 65 20 69 66 28 20 70 54 79 70 65 2d 3e  else if( pType->
cab0: 6e 3d 3d 36 20 26 26 20 73 71 6c 69 74 65 33 53  n==6 && sqlite3S
cac0: 74 72 4e 49 43 6d 70 28 22 73 74 6f 72 65 64 22  trNICmp("stored"
cad0: 2c 70 54 79 70 65 2d 3e 7a 2c 36 29 3d 3d 30 20  ,pType->z,6)==0 
cae0: 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65 20 3d  ){.      eType =
caf0: 20 43 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 3b   COLFLAG_STORED;
cb00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cb10: 20 20 67 6f 74 6f 20 67 65 6e 65 72 61 74 65 64    goto generated
cb20: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
cb30: 7d 0a 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61  }.  pCol->colFla
cb40: 67 73 20 7c 3d 20 65 54 79 70 65 3b 0a 20 20 61  gs |= eType;.  a
cb50: 73 73 65 72 74 28 20 54 46 5f 48 61 73 56 69 72  ssert( TF_HasVir
cb60: 74 75 61 6c 3d 3d 43 4f 4c 46 4c 41 47 5f 56 49  tual==COLFLAG_VI
cb70: 52 54 55 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  RTUAL );.  asser
cb80: 74 28 20 54 46 5f 48 61 73 53 74 6f 72 65 64 3d  t( TF_HasStored=
cb90: 3d 43 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 20  =COLFLAG_STORED 
cba0: 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  );.  pTab->tabFl
cbb0: 61 67 73 20 7c 3d 20 65 54 79 70 65 3b 0a 20 20  ags |= eType;.  
cbc0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
cbd0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
cbe0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
cbf0: 30 29 3b 0a 20 20 67 6f 74 6f 20 67 65 6e 65 72  0);.  goto gener
cc00: 61 74 65 64 5f 64 6f 6e 65 3b 0a 0a 67 65 6e 65  ated_done;..gene
cc10: 72 61 74 65 64 5f 65 72 72 6f 72 3a 0a 20 20 73  rated_error:.  s
cc20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cc30: 50 61 72 73 65 2c 20 22 69 6e 63 6f 72 72 65 63  Parse, "incorrec
cc40: 74 20 47 45 4e 45 52 41 54 45 44 20 41 4c 57 41  t GENERATED ALWA
cc50: 59 53 20 41 53 20 6f 6e 20 63 6f 6c 75 6d 6e 20  YS AS on column 
cc60: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
cc70: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
cc80: 3e 7a 4e 61 6d 65 29 3b 0a 67 65 6e 65 72 61 74  >zName);.generat
cc90: 65 64 5f 64 6f 6e 65 3a 0a 20 20 73 71 6c 69 74  ed_done:.  sqlit
cca0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
ccb0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b  rse->db, pExpr);
ccc0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 54 68 72 6f  .#else.  /* Thro
ccd0: 77 20 61 6e 64 20 65 72 72 6f 72 20 66 6f 72 20  w and error for 
cce0: 74 68 65 20 47 45 4e 45 52 41 54 45 44 20 41 4c  the GENERATED AL
ccf0: 57 41 59 53 20 41 53 20 63 6c 61 75 73 65 20 69  WAYS AS clause i
cd00: 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  f the.  ** SQLIT
cd10: 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44  E_OMIT_GENERATED
cd20: 5f 43 4f 4c 55 4d 4e 53 20 63 6f 6d 70 69 6c 65  _COLUMNS compile
cd30: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
cd40: 75 73 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  used. */.  sqlit
cd50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
cd60: 65 2c 20 22 47 45 4e 45 52 41 54 45 44 20 41 4c  e, "GENERATED AL
cd70: 57 41 59 53 20 41 53 20 6e 6f 74 20 73 75 70 70  WAYS AS not supp
cd80: 6f 72 74 65 64 22 29 3b 0a 20 20 73 71 6c 69 74  orted");.  sqlit
cd90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
cda0: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b  rse->db, pExpr);
cdb0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cdc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
cdd0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
cde0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
cdf0: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
ce00: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
ce10: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
ce20: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
ce30: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
ce40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
ce50: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
ce60: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
ce70: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
ce80: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
ce90: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
cea0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
ceb0: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
cec0: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
ced0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
cee0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
cef0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
cf00: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
cf10: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
cf20: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
cf30: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
cf40: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
cf50: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
cf60: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
cf70: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
cf80: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
cf90: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
cfa0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
cfb0: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
cfc0: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
cfd0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
cfe0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
cff0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
d000: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
d010: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
d020: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d030: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
d040: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
d050: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
d060: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
d070: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
d080: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
d090: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
d0a0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
d0b0: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
d0c0: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
d0d0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
d0e0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
d0f0: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
d100: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
d110: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
d120: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
d130: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
d140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
d150: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d160: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d170: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
d180: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
d190: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
d1a0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
d1b0: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
d1c0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
d1d0: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
d1e0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
d1f0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
d200: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
d210: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
d220: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
d230: 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  etCollSeq(pParse
d240: 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  , enc, pColl, zN
d250: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ame);.  }..  ret
d260: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
d270: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d280: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
d290: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
d2a0: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
d2b0: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
d2c0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
d2d0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
d2e0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
d2f0: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
d300: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
d310: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
d320: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
d330: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
d340: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
d350: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
d360: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
d370: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
d380: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
d390: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
d3a0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
d3b0: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
d3c0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
d3d0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
d3e0: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
d3f0: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
d400: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
d410: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
d420: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
d430: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
d440: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
d450: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
d460: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
d470: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
d480: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
d490: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
d4a0: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
d4b0: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
d4c0: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
d4d0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
d4e0: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
d4f0: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
d500: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
d510: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
d520: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
d530: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a  safe enough..**.
d540: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
d550: 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36  N-OF: R-34230-56
d560: 30 34 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  049 SQLite autom
d570: 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65  atically increme
d580: 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  nts.** the schem
d590: 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76  a-version whenev
d5a0: 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 68  er the schema ch
d5b0: 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anges..*/.void s
d5c0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
d5d0: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
d5e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
d5f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d600: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
d610: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d620: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
d630: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
d640: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
d650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d660: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
d670: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
d680: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
d690: 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  N, .            
d6a0: 20 20 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28         (int)(1+(
d6b0: 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62  unsigned)db->aDb
d6c0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
d6d0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a  chema_cookie));.
d6e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
d6f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d700: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
d710: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
d720: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
d730: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
d740: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
d750: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
d760: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
d770: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
d780: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
d790: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
d7a0: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
d7b0: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
d7c0: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
d7d0: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
d7e0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
d7f0: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
d800: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
d810: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
d820: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
d830: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
d840: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
d850: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
d860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
d870: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  rst parameter is
d880: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
d890: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
d8a0: 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70  The second .** p
d8b0: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
d8c0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
d8d0: 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ger that contain
d8e0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a  s the offset at.
d8f0: 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  ** which to writ
d900: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
d910: 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  t buffer. This f
d920: 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74  unction copies t
d930: 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  he.** nul-termin
d940: 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e  ated string poin
d950: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68  ted to by the th
d960: 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a  ird parameter, z
d970: 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20  SignedIdent,.** 
d980: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
d990: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62   offset in the b
d9a0: 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65  uffer and update
d9b0: 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72  s *pIdx to refer
d9c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
d9d0: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
d9e0: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
d9f0: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
da00: 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ng..** .** If th
da10: 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64  e string zSigned
da20: 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65  Ident consists e
da30: 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61  ntirely of alpha
da40: 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72  -numeric.** char
da50: 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74  acters, does not
da60: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69   begin with a di
da70: 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61  git and is not a
da80: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a  n SQL keyword,.*
da90: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  * then it is cop
daa0: 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
dab0: 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79  t buffer exactly
dac0: 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72   as it is. Other
dad0: 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71  wise,.** it is q
dae0: 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62  uoted using doub
daf0: 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74  le-quotes..*/.st
db00: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
db10: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
db20: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
db30: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
db40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
db50: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
db60: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
db70: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
db80: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
db90: 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a   *pIdx;..  for(j
dba0: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
dbb0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ++){.    if( !sq
dbc0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64  lite3Isalnum(zId
dbd0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
dbe0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
dbf0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
dc00: 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69  te = sqlite3Isdi
dc10: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
dc20: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
dc30: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
dc40: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
dc50: 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ID.            |
dc60: 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20  | zIdent[j]!=0. 
dc70: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d             || j=
dc80: 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51  =0;..  if( needQ
dc90: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
dca0: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
dcb0: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
dcc0: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
dcd0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
dce0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
dcf0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
dd00: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
dd10: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
dd20: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
dd30: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
dd40: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
dd50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
dd60: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
dd70: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
dd80: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
dd90: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
dda0: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
ddb0: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
ddc0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
ddd0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
dde0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
ddf0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
de00: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
de10: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
de20: 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
de30: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e   Table *p){.  in
de40: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
de50: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
de60: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
de70: 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20  *zEnd;.  Column 
de80: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
de90: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
dea0: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
deb0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
dec0: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
ded0: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
dee0: 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20  Name) + 5;.  }. 
def0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
df00: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
df10: 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20  f( n<50 ){ .    
df20: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
df30: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
df40: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
df50: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
df60: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
df70: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
df80: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
df90: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
dfa0: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
dfb0: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
dfc0: 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20  locRaw(0, n);.  
dfd0: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
dfe0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
dff0: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
e000: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
e010: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c  ite3_snprintf(n,
e020: 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20   zStmt, "CREATE 
e030: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
e040: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e050: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
e060: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
e070: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
e080: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
e090: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
e0a0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
e0b0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
e0c0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
e0d0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54  char * const azT
e0e0: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ype[] = {.      
e0f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
e100: 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20  BLOB    */ "",. 
e110: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
e120: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
e130: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
e140: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
e150: 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22  UMERIC */ " NUM"
e160: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
e170: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
e180: 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20  */ " INT",.     
e190: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
e1a0: 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45  _REAL    */ " RE
e1b0: 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  AL".    };.    i
e1c0: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  nt len;.    cons
e1d0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a  t char *zType;..
e1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
e1f0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
e200: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
e210: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
e220: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
e230: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
e240: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
e250: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
e260: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73  >zName);.    ass
e270: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
e280: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
e290: 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  LOB >= 0 );.    
e2a0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
e2b0: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
e2c0: 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69  F_BLOB < ArraySi
e2d0: 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20  ze(azType) );.  
e2e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
e2f0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
e300: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
e310: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
e320: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
e330: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
e340: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
e350: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
e360: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
e370: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
e380: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
e390: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
e3a0: 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74  EGER );.    test
e3b0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
e3c0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
e3d0: 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20  _REAL );.    .  
e3e0: 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65    zType = azType
e3f0: 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20  [pCol->affinity 
e400: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  - SQLITE_AFF_BLO
e410: 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71  B];.    len = sq
e420: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
e430: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
e440: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
e450: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
e460: 42 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  B .            |
e470: 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  | pCol->affinity
e480: 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ==sqlite3Affinit
e490: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20  yType(zType, 0) 
e4a0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
e4b0: 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20  Stmt[k], zType, 
e4c0: 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c  len);.    k += l
e4d0: 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
e4e0: 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71  k<=n );.  }.  sq
e4f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
e500: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
e510: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
e520: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
e530: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49  *.** Resize an I
e540: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68  ndex object to h
e550: 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f  old N columns to
e560: 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tal.  Return SQL
e570: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
e580: 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  cess and SQLITE_
e590: 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20  NOMEM on an OOM 
e5a0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
e5b0: 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78   int resizeIndex
e5c0: 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
e5d0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
e5e0: 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20   int N){.  char 
e5f0: 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e  *zExtra;.  int n
e600: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78  Byte;.  if( pIdx
e610: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72  ->nColumn>=N ) r
e620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e630: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
e640: 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b  >isResized==0 );
e650: 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65  .  nByte = (size
e660: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
e670: 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a  of(i16) + 1)*N;.
e680: 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74    zExtra = sqlit
e690: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e6a0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
e6b0: 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74   zExtra==0 ) ret
e6c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e6d0: 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
e6e0: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a  zExtra, pIdx->az
e6f0: 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61  Coll, sizeof(cha
e700: 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r*)*pIdx->nColum
e710: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  n);.  pIdx->azCo
e720: 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
e730: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
e740: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
e750: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
e760: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
e770: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
e780: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
e790: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
e7a0: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
e7b0: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
e7c0: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
e7d0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
e7e0: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
e7f0: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
e800: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
e810: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
e820: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
e830: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
e840: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
e850: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e860: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
e870: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
e880: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
e890: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
e8a0: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
e8b0: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
e8c0: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
e8d0: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
e8e0: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
e8f0: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
e900: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
e910: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
e920: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
e930: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
e940: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
e950: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
e960: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
e970: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
e980: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
e990: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
e9a0: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
e9b0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e9c0: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
e9d0: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
e9e0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
e9f0: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
ea00: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
ea10: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
ea20: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
ea30: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
ea40: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
ea50: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
ea60: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
ea70: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
ea80: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
ea90: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
eaa0: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
eab0: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
eac0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
ead0: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
eae0: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
eaf0: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
eb00: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
eb10: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
eb20: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
eb30: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
eb40: 20 69 66 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   if column numbe
eb50: 72 20 78 20 69 73 20 61 6e 79 20 6f 66 20 74 68  r x is any of th
eb60: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
eb70: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 2e  ries of aiCol[].
eb80: 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64  .** This is used
eb90: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
eba0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
ebb0: 65 72 20 78 20 61 70 70 65 61 72 73 20 69 6e 20  er x appears in 
ebc0: 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  any of the.** fi
ebd0: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
ebe0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f   of an index..*/
ebf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
ec00: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
ec10: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
ec20: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
ec30: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 7b  e( nCol-- > 0 ){
ec40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 69 43  .    assert( aiC
ec50: 6f 6c 5b 30 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  ol[0]>=0 );.    
ec60: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
ec70: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
ec80: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
ec90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
eca0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
ecb0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  if any of the fi
ecc0: 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69 65 73  rst nKey entries
ecd0: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 65   of index pIdx e
ece0: 78 61 63 74 6c 79 0a 2a 2a 20 6d 61 74 63 68 20  xactly.** match 
ecf0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 65 6e 74 72  the iCol-th entr
ed00: 79 20 6f 66 20 70 50 6b 2e 20 20 70 50 6b 20 69  y of pPk.  pPk i
ed10: 73 20 61 6c 77 61 79 73 20 61 20 57 49 54 48 4f  s always a WITHO
ed20: 55 54 20 52 4f 57 49 44 0a 2a 2a 20 50 52 49 4d  UT ROWID.** PRIM
ed30: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20  ARY KEY index.  
ed40: 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78  pIdx is an index
ed50: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
ed60: 6c 65 2e 20 20 70 49 64 78 20 6d 61 79 0a 2a 2a  le.  pIdx may.**
ed70: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   or may not be t
ed80: 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
ed90: 20 70 50 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   pPk..**.** The 
eda0: 66 69 72 73 74 20 6e 4b 65 79 20 65 6e 74 72 69  first nKey entri
edb0: 65 73 20 6f 66 20 70 49 64 78 20 61 72 65 20 67  es of pIdx are g
edc0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
edd0: 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 73  ordinary columns
ede0: 2c 0a 2a 2a 20 6e 6f 74 20 61 20 72 6f 77 69 64  ,.** not a rowid
edf0: 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   or expression..
ee00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ee10: 6e 65 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  ne differs from 
ee20: 68 61 73 43 6f 6c 75 6d 6e 28 29 20 69 6e 20 74  hasColumn() in t
ee30: 68 61 74 20 62 6f 74 68 20 74 68 65 20 63 6f 6c  hat both the col
ee40: 75 6d 6e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  umn and the.** c
ee50: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ee60: 65 20 6d 75 73 74 20 6d 61 74 63 68 20 66 6f 72  e must match for
ee70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 62   this routine, b
ee80: 75 74 20 66 6f 72 20 68 61 73 43 6f 6c 75 6d 6e  ut for hasColumn
ee90: 28 29 20 6f 6e 6c 79 0a 2a 2a 20 74 68 65 20 63  () only.** the c
eea0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6d 75 73 74 20  olumn name must 
eeb0: 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  match..*/.static
eec0: 20 69 6e 74 20 69 73 44 75 70 43 6f 6c 75 6d 6e   int isDupColumn
eed0: 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e  (Index *pIdx, in
eee0: 74 20 6e 4b 65 79 2c 20 49 6e 64 65 78 20 2a 70  t nKey, Index *p
eef0: 50 6b 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  Pk, int iCol){. 
ef00: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73   int i, j;.  ass
ef10: 65 72 74 28 20 6e 4b 65 79 3c 3d 70 49 64 78 2d  ert( nKey<=pIdx-
ef20: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
ef30: 73 65 72 74 28 20 69 43 6f 6c 3c 4d 41 58 28 70  sert( iCol<MAX(p
ef40: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2c 70 50 6b 2d  Pk->nColumn,pPk-
ef50: 3e 6e 4b 65 79 43 6f 6c 29 20 29 3b 0a 20 20 61  >nKeyCol) );.  a
ef60: 73 73 65 72 74 28 20 70 50 6b 2d 3e 69 64 78 54  ssert( pPk->idxT
ef70: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
ef80: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29  YPE_PRIMARYKEY )
ef90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d  ;.  assert( pPk-
efa0: 3e 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  >pTable->tabFlag
efb0: 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52 6f  s & TF_WithoutRo
efc0: 77 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  wid );.  assert(
efd0: 20 70 50 6b 2d 3e 70 54 61 62 6c 65 3d 3d 70 49   pPk->pTable==pI
efe0: 64 78 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20  dx->pTable );.  
eff0: 74 65 73 74 63 61 73 65 28 20 70 50 6b 3d 3d 70  testcase( pPk==p
f000: 49 64 78 20 29 3b 0a 20 20 6a 20 3d 20 70 50 6b  Idx );.  j = pPk
f010: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
f020: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 21 3d 58  ;.  assert( j!=X
f030: 4e 5f 52 4f 57 49 44 20 26 26 20 6a 21 3d 58 4e  N_ROWID && j!=XN
f040: 5f 45 58 50 52 20 29 3b 0a 20 20 66 6f 72 28 69  _EXPR );.  for(i
f050: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
f060: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
f070: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e  dx->aiColumn[i]>
f080: 3d 30 20 7c 7c 20 6a 3e 3d 30 20 29 3b 0a 20 20  =0 || j>=0 );.  
f090: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
f0a0: 6c 75 6d 6e 5b 69 5d 3d 3d 6a 20 0a 20 20 20 20  lumn[i]==j .    
f0b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
f0c0: 6d 70 28 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  mp(pIdx->azColl[
f0d0: 69 5d 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  i], pPk->azColl[
f0e0: 69 43 6f 6c 5d 29 3d 3d 30 0a 20 20 20 20 29 7b  iCol])==0.    ){
f0f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
f100: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f110: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63  urn 0;.}../* Rec
f120: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f  ompute the colNo
f130: 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20  tIdxed field of 
f140: 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the Index..**.**
f150: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20   colNotIdxed is 
f160: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68  a bitmask that h
f170: 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65  as a 0 bit repre
f180: 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64  senting each ind
f190: 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  exed.** columns 
f1a0: 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20  that are within 
f1b0: 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
f1c0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
f1d0: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d  e.  The.** high-
f1e0: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c  order bit of col
f1f0: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61  NotIdxed is alwa
f200: 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64  ys 1.  All unind
f210: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  exed columns.** 
f220: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76  of the table hav
f230: 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e a 1..**.** The
f240: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73   colNotIdxed mas
f250: 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68  k is AND-ed with
f260: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   the SrcList.a[]
f270: 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a  .colUsed mask.**
f280: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
f290: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f   the index is co
f2a0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f  vering index..*/
f2b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
f2c0: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
f2d0: 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70  Indexed(Index *p
f2e0: 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  Idx){.  Bitmask 
f2f0: 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  m = 0;.  int j;.
f300: 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43    for(j=pIdx->nC
f310: 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  olumn-1; j>=0; j
f320: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  --){.    int x =
f330: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
f340: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30  j];.    if( x>=0
f350: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
f360: 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( x==BMS-1 );.
f370: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f380: 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20  x==BMS-2 );.    
f390: 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20    if( x<BMS-1 ) 
f3a0: 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b  m |= MASKBIT(x);
f3b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64  .    }.  }.  pId
f3c0: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d  x->colNotIdxed =
f3d0: 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   ~m;.  assert( (
f3e0: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
f3f0: 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a  d>>63)==1 );.}..
f400: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
f410: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65  ne runs at the e
f420: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20  nd of parsing a 
f430: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
f440: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68  tement that.** h
f450: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  as a WITHOUT ROW
f460: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ID clause.  The 
f470: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
f480: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72  ine is to conver
f490: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e  t both.** intern
f4a0: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73  al schema data s
f4b0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68  tructures and th
f4c0: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45  e generated VDBE
f4d0: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68   code so that th
f4e0: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70  ey.** are approp
f4f0: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48  riate for a WITH
f500: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
f510: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77  instead of a row
f520: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61  id table..** Cha
f530: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  nges include:.**
f540: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74  .**     (1)  Set
f550: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
f560: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
f570: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
f580: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
f590: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72       (2)  Conver
f5a0: 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f  t P3 parameter o
f5b0: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42  f the OP_CreateB
f5c0: 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f  tree from BTREE_
f5d0: 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20  INTKEY .**      
f5e0: 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42      into BTREE_B
f5f0: 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28  LOBKEY..**     (
f600: 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63  3)  Bypass the c
f610: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  reation of the s
f620: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f630: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  le entry.**     
f640: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49       for the PRI
f650: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
f660: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
f670: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
f680: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
f690: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
f6a0: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
f6b0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
f6c0: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29  self..**     (4)
f6d0: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
f6e0: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
f6f0: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
f700: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
f710: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
f720: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
f730: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
f740: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20  le..**     (5)  
f750: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
f760: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
f770: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
f780: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
f790: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52    so that the PR
f7a0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63  IMARY KEY is a c
f7b0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
f7c0: 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20  The surplus.**  
f7d0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
f7e0: 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49  are part of KeyI
f7f0: 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e  nfo.nAllField an
f800: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66  d are not used f
f810: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  or.**          s
f820: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70  orting or lookup
f830: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63   or uniqueness c
f840: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36  hecks..**     (6
f850: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72  )  Replace the r
f860: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c  owid tail on all
f870: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
f880: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a  enerated UNIQUE.
f890: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
f8a0: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49  ces with the PRI
f8b0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
f8c0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74  ..**.** For virt
f8d0: 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79  ual tables, only
f8e0: 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (1) is performe
f8f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
f900: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  d convertToWitho
f910: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72  utRowidTable(Par
f920: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
f930: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
f940: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78  x *pIdx;.  Index
f950: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b   *pPk;.  int nPk
f960: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a  ;.  int nExtra;.
f970: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
f980: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
f990: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
f9a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f9b0: 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76  e;..  /* Mark ev
f9c0: 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ery PRIMARY KEY 
f9d0: 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55  column as NOT NU
f9e0: 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72 20 69  LL (except for i
f9f0: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a  mposter tables).
fa00: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
fa10: 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
fa20: 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  le ){.    for(i=
fa30: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
fa40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
fa50: 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e   (pTab->aCol[i].
fa60: 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
fa70: 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29  AG_PRIMKEY)!=0 )
fa80: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
fa90: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
faa0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
fab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
fac0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
fad0: 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P3 operand of th
fae0: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
faf0: 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52   opcode from BTR
fb00: 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69  EE_INTKEY.  ** i
fb10: 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  nto BTREE_BLOBKE
fb20: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  Y..  */.  if( pP
fb30: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
fb40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  ){.    assert( v
fb50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
fb60: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70  dbeChangeP3(v, p
fb70: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
fb80: 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29  , BTREE_BLOBKEY)
fb90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
fba0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
fbb0: 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69  EY index.  Or, i
fbc0: 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73  f this table was
fbd0: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
fbe0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
fbf0: 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63  ARY KEY table, c
fc00: 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d  reate a new PRIM
fc10: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a  ARY KEY index. .
fc20: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
fc30: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
fc40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
fc50: 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54  ;.    Token ipkT
fc60: 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  oken;.    sqlite
fc70: 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54  3TokenInit(&ipkT
fc80: 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  oken, pTab->aCol
fc90: 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e  [pTab->iPKey].zN
fca0: 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ame);.    pList 
fcb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
fcc0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
fcd0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
fce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fcf0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
fd00: 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29  , &ipkToken, 0))
fd10: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
fd20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
fd30: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
fd40: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73  BJECT ){.      s
fd50: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
fd60: 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 70  nRemap(pParse, p
fd70: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
fd80: 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65 79 29 3b  , &pTab->iPKey);
fd90: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
fda0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46 6c 61 67 73  ->a[0].sortFlags
fdb0: 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   = pParse->iPkSo
fdc0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73  rtOrder;.    ass
fdd0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
fde0: 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  wTable==pTab );.
fdf0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
fe00: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
fe10: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
fe20: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
fe30: 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f  ist, pTab->keyCo
fe40: 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a  nf, 0, 0, 0, 0,.
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44         SQLITE_ID
fe70: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
fe80: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
fe90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
fea0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
feb0: 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20  turn;.    pPk = 
fec0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
fed0: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
fee0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
fef0: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 7d  KeyCol==1 );.  }
ff00: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20  else{.    pPk = 
ff10: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
ff20: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
ff30: 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30    assert( pPk!=0
ff40: 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
ff50: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65  ** Remove all re
ff60: 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20  dundant columns 
ff70: 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59  from the PRIMARY
ff80: 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70   KEY.  For examp
ff90: 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a  le, change.    *
ffa0: 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  * "PRIMARY KEY(a
ffb0: 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22  ,b,a,b,c,b,c,d)"
ffc0: 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d   into just "PRIM
ffd0: 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29  ARY KEY(a,b,c,d)
ffe0: 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a  ".  Later.    **
fff0: 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
10000 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
10010 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74  ntains no repeat
10020 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ed columns..    
10030 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31  */.    for(i=j=1
10040 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; i<pPk->nKeyCol
10050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
10060 28 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 50  ( isDupColumn(pP
10070 6b 2c 20 6a 2c 20 70 50 6b 2c 20 69 29 20 29 7b  k, j, pPk, i) ){
10080 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43  .        pPk->nC
10090 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  olumn--;.      }
100a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
100b0 73 74 63 61 73 65 28 20 68 61 73 43 6f 6c 75 6d  stcase( hasColum
100c0 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
100d0 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
100e0 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  n[i]) );.       
100f0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
10100 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
10110 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
10120 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3d 20 70  SortOrder[j] = p
10130 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  Pk->aSortOrder[i
10140 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  ];.        pPk->
10150 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
10160 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
10170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10180 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
10190 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = j;.  }.  asse
101a0 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
101b0 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  pPk->isCovering 
101c0 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e  = 1;.  if( !db->
101d0 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62  init.imposterTab
101e0 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f  le ) pPk->uniqNo
101f0 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50 6b  tNull = 1;.  nPk
10200 20 3d 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   = pPk->nColumn 
10210 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
10220 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65  .  /* Bypass the
10230 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
10240 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72   PRIMARY KEY btr
10250 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ee and the sqlit
10260 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
10270 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69 73 20  ble entry. This 
10280 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
10290 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 67 65   if currently ge
102a0 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a 20 20  nerating VDBE.  
102b0 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52  ** code for a CR
102c0 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20  EATE TABLE (not 
102d0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65  when parsing one
102e0 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 61 64   as part of read
102f0 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  ing.  ** a datab
10300 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f  ase schema).  */
10310 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 6b 2d  .  if( v && pPk-
10320 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 61  >tnum>0 ){.    a
10330 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
10340 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 73  busy==0 );.    s
10350 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10360 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74  Opcode(v, pPk->t
10370 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  num, OP_Goto);. 
10380 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f   }..  /* The roo
10390 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
103a0 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
103b0 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
103c0 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
103d0 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
103e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
103f0 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
10400 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
10410 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
10420 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
10430 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
10440 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
10450 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
10460 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
10470 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
10480 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
10490 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
104a0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
104b0 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
104c0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
104d0 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
104e0 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
104f0 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
10500 20 20 20 20 20 69 66 28 20 21 69 73 44 75 70 43       if( !isDupC
10510 6f 6c 75 6d 6e 28 70 49 64 78 2c 20 70 49 64 78  olumn(pIdx, pIdx
10520 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20  ->nKeyCol, pPk, 
10530 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  i) ){.        te
10540 73 74 63 61 73 65 28 20 68 61 73 43 6f 6c 75 6d  stcase( hasColum
10550 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  n(pIdx->aiColumn
10560 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  , pIdx->nKeyCol,
10570 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
10580 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 2b  ]) );.        n+
10590 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
105a0 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
105b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
105c0 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72 73  ndex is a supers
105d0 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  et of the primar
105e0 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70  y key */.      p
105f0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  Idx->nColumn = p
10600 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
10610 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10620 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69    }.    if( resi
10630 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
10640 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  , pIdx, pIdx->nK
10650 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72  eyCol+n) ) retur
10660 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  n;.    for(i=0, 
10670 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j=pIdx->nKeyCol;
10680 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20   i<nPk; i++){.  
10690 20 20 20 20 69 66 28 20 21 69 73 44 75 70 43 6f      if( !isDupCo
106a0 6c 75 6d 6e 28 70 49 64 78 2c 20 70 49 64 78 2d  lumn(pIdx, pIdx-
106b0 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 69  >nKeyCol, pPk, i
106c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  ) ){.        tes
106d0 74 63 61 73 65 28 20 68 61 73 43 6f 6c 75 6d 6e  tcase( hasColumn
106e0 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
106f0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
10700 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
10710 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ) );.        pId
10720 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  x->aiColumn[j] =
10730 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
10740 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ];.        pIdx-
10750 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
10760 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
10770 20 20 20 20 20 69 66 28 20 70 50 6b 2d 3e 61 53       if( pPk->aS
10780 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
10790 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
107a0 74 69 63 6b 65 74 20 68 74 74 70 73 3a 2f 2f 77  ticket https://w
107b0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
107c0 63 2f 69 6e 66 6f 2f 62 62 61 37 62 36 39 66 39  c/info/bba7b69f9
107d0 38 34 39 62 35 62 66 20 2a 2f 0a 20 20 20 20 20  849b5bf */.     
107e0 20 20 20 20 20 70 49 64 78 2d 3e 62 41 73 63 4b       pIdx->bAscK
107f0 65 79 42 75 67 20 3d 20 31 3b 0a 20 20 20 20 20  eyBug = 1;.     
10800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 2b 2b     }.        j++
10810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10820 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
10830 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
10840 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
10850 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
10860 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
10870 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
10880 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
10890 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
108a0 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 6e 45   index.  */.  nE
108b0 78 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28  xtra = 0;.  for(
108c0 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
108d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
108e0 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
108f0 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6e 50 6b 2c 20  >aiColumn, nPk, 
10900 69 29 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  i).     && (pTab
10910 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61  ->aCol[i].colFla
10920 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49 52  gs & COLFLAG_VIR
10930 54 55 41 4c 29 3d 3d 30 20 29 20 6e 45 78 74 72  TUAL)==0 ) nExtr
10940 61 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  a++;.  }.  if( r
10950 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
10960 28 64 62 2c 20 70 50 6b 2c 20 6e 50 6b 2b 6e 45  (db, pPk, nPk+nE
10970 78 74 72 61 29 20 29 20 72 65 74 75 72 6e 3b 0a  xtra) ) return;.
10980 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b    for(i=0, j=nPk
10990 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
109a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 68  i++){.    if( !h
109b0 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
109c0 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 0a 20 20  Column, j, i).  
109d0 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f     && (pTab->aCo
109e0 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
109f0 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c 29  COLFLAG_VIRTUAL)
10a00 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
10a10 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
10a20 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
10a30 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
10a40 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 50 6b  ] = i;.      pPk
10a50 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71  ->azColl[j] = sq
10a60 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
10a70 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
10a80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10a90 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
10aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
10ab0 2d 3e 6e 4e 56 43 6f 6c 3c 3d 6a 20 29 3b 0a 20  ->nNVCol<=j );. 
10ac0 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
10ad0 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29  sNotIndexed(pPk)
10ae0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10af0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10b00 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TABLE./*.** Retu
10b10 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d 65  rn true if zName
10b20 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61 62   is a shadow tab
10b30 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 63  le name in the c
10b40 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 0a  urrent database.
10b50 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
10b60 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74 65  *.** zName is te
10b70 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66 69  mporarily modifi
10b80 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72 6f  ed while this ro
10b90 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67  utine is running
10ba0 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73 74  , but is.** rest
10bb0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
10bc0 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f 72  inal value prior
10bd0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
10be0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
10bf0 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61 64  tatic int isShad
10c00 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c 69  owTableName(sqli
10c10 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 7a  te3 *db, char *z
10c20 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
10c30 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Tail;           
10c40 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10c50 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22 5f  r to the last "_
10c60 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  " in zName */.  
10c70 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c90 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61 6d   Table that zNam
10ca0 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f 66  e is a shadow of
10cb0 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70 4d   */.  Module *pM
10cc0 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  od;             
10cd0 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66 6f      /* Module fo
10ce0 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  r the virtual ta
10cf0 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c 20  ble */..  zTail 
10d00 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65 2c  = strrchr(zName,
10d10 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54 61   '_');.  if( zTa
10d20 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  il==0 ) return 0
10d30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  ;.  *zTail = 0;.
10d40 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
10d50 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
10d60 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61 69  ame, 0);.  *zTai
10d70 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20 70  l = '_';.  if( p
10d80 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
10d90 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72 74  0;.  if( !IsVirt
10da0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
10db0 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20 28  rn 0;.  pMod = (
10dc0 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48  Module*)sqlite3H
10dd0 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f  ashFind(&db->aMo
10de0 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d 6f  dule, pTab->azMo
10df0 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20 69  duleArg[0]);.  i
10e00 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65 74  f( pMod==0 ) ret
10e10 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f  urn 0;.  if( pMo
10e20 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65 72  d->pModule->iVer
10e30 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e 20  sion<3 ) return 
10e40 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  0;.  if( pMod->p
10e50 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e  Module->xShadowN
10e60 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
10e70 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f 64  0;.  return pMod
10e80 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64  ->pModule->xShad
10e90 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29 3b  owName(zTail+1);
10ea0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
10eb0 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  e isShadowTableN
10ec0 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  ame(x,y) 0.#endi
10ed0 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
10ee0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10ef0 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ABLE */../*.** T
10f00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10f10 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
10f20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
10f30 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
10f40 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
10f50 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
10f60 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
10f70 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
10f80 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
10f90 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
10fa0 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
10fb0 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
10fc0 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
10fd0 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
10fe0 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
10ff0 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
11000 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
11010 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
11020 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
11030 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
11040 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
11050 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
11060 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
11070 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
11080 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
11090 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
110a0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
110b0 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
110c0 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
110d0 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
110e0 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
110f0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
11100 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
11110 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
11120 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
11130 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
11140 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
11150 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
11160 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
11170 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
11180 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
11190 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
111a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
111b0 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
111c0 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
111d0 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
111e0 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
111f0 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
11200 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
11210 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
11220 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
11230 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
11240 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
11250 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
11260 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
11270 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
11280 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
11290 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
112a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
112b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
112c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
112d0 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
112e0 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
112f0 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
11300 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
11310 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
11320 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
11330 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20   The ')' before 
11340 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43  options in the C
11350 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
11360 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20   u8 tabOpts,    
11370 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
11380 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e  a table options.
11390 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20   Usually 0. */. 
113a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
113b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
113c0 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
113d0 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
113e0 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
113f0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11400 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
11410 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
11420 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11430 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
11440 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
11450 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11470 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
11480 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65  h the table live
11490 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
114a0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
114b0 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69   /* An implied i
114c0 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
114d0 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64  e */..  if( pEnd
114e0 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
114f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
11500 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
11510 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11520 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
11530 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
11540 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
11550 3b 0a 20 20 70 2d 3e 6e 4e 56 43 6f 6c 20 3d 20  ;.  p->nNVCol = 
11560 70 2d 3e 6e 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  p->nCol;..  if( 
11570 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69 73  pSelect==0 && is
11580 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28  ShadowTableName(
11590 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b  db, p->zName) ){
115a0 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73  .    p->tabFlags
115b0 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a 20   |= TF_Shadow;. 
115c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
115d0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
115e0 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
115f0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
11600 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
11610 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
11620 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
11630 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
11640 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
11650 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
11660 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
11670 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
11680 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
11690 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
116a0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
116b0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
116c0 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
116d0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
116e0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
116f0 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
11700 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
11710 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne.).  **.  ** I
11720 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
11730 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61  number is 1, tha
11740 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20  t means this is 
11750 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
11760 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73  r.  ** table its
11770 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74  elf.  So mark it
11780 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f   read-only..  */
11790 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
117a0 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20  busy ){.    if( 
117b0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
117c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
117d0 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20 20  (pParse, "");.  
117e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
117f0 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  }.    p->tnum = 
11800 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
11810 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75  ;.    if( p->tnu
11820 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61  m==1 ) p->tabFla
11830 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c  gs |= TF_Readonl
11840 79 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  y;.  }..  assert
11850 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
11860 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
11870 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  y)==0.       || 
11880 70 2d 3e 69 50 4b 65 79 3e 3d 30 20 7c 7c 20 73  p->iPKey>=0 || s
11890 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
118a0 49 6e 64 65 78 28 70 29 21 3d 30 20 29 3b 0a 20  Index(p)!=0 );. 
118b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74 61 62   assert( (p->tab
118c0 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
118d0 69 6d 61 72 79 4b 65 79 29 21 3d 30 0a 20 20 20  imaryKey)!=0.   
118e0 20 20 20 20 7c 7c 20 28 70 2d 3e 69 50 4b 65 79      || (p->iPKey
118f0 3c 30 20 26 26 20 73 71 6c 69 74 65 33 50 72 69  <0 && sqlite3Pri
11900 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3d  maryKeyIndex(p)=
11910 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  =0) );..  /* Spe
11920 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
11930 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
11940 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
11950 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
11960 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
11970 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
11980 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
11990 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
119a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
119b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
119c0 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
119d0 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
119e0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
119f0 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
11a00 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
11a10 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
11a20 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
11a30 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
11a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11a50 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
11a60 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
11a70 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
11a80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
11a90 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
11aa0 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
11ab0 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 7c  F_WithoutRowid |
11ac0 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
11ad0 69 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  id;.  }..#ifndef
11ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
11af0 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
11b00 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
11b10 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
11b20 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
11b30 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
11b40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
11b50 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
11b60 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
11b70 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
11b80 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
11b90 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
11ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
11bb0 4b 29 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  K) */.#ifndef SQ
11bc0 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41  LITE_OMIT_GENERA
11bd0 54 45 44 5f 43 4f 4c 55 4d 4e 53 0a 20 20 69 66  TED_COLUMNS.  if
11be0 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ( p->tabFlags & 
11bf0 28 54 46 5f 48 61 73 56 69 72 74 75 61 6c 7c 54  (TF_HasVirtual|T
11c00 46 5f 48 61 73 53 74 6f 72 65 64 29 20 29 7b 0a  F_HasStored) ){.
11c10 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
11c20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
11c30 6e 43 6f 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nCol; ii++){.   
11c40 20 20 20 75 33 32 20 63 6f 6c 46 6c 61 67 73 20     u32 colFlags 
11c50 3d 20 70 2d 3e 61 43 6f 6c 5b 69 69 5d 2e 63 6f  = p->aCol[ii].co
11c60 6c 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66  lFlags;.      if
11c70 28 20 28 63 6f 6c 46 6c 61 67 73 20 26 20 28 43  ( (colFlags & (C
11c80 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 7c 43 4f  OLFLAG_STORED|CO
11c90 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c 29 29 21  LFLAG_VIRTUAL))!
11ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
11cb0 28 20 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ( colFlags & COL
11cc0 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 7b 0a  FLAG_VIRTUAL ){.
11cd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 4e 56            p->nNV
11ce0 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Col--;.         
11cf0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4e 56 43   assert( p->nNVC
11d00 6f 6c 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol>=0 );.       
11d10 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
11d20 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
11d30 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
11d40 2c 20 4e 43 5f 47 65 6e 43 6f 6c 2c 20 0a 20 20  , NC_GenCol, .  
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 70 2d 3e 61 43 6f 6c 5b 69 69 5d 2e 70 44    p->aCol[ii].pD
11d80 66 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  flt, 0);.      }
11d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11da0 66 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  f..  /* Special 
11db0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
11dc0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62  ITHOUT ROWID Tab
11dd0 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 28 74 61  les */.  if( (ta
11de0 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f  bOpts & TF_Witho
11df0 75 74 52 6f 77 69 64 29 21 3d 30 20 29 7b 0a 20  utRowid)!=0 ){. 
11e00 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68     convertToWith
11e10 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50  outRowidTable(pP
11e20 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
11e30 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11e40 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11e50 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 0a 20  p->pSchema);... 
11e60 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
11e70 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
11e80 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
11e90 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
11ea0 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
11eb0 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
11ec0 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
11ed0 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
11ee0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11ef0 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
11f00 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
11f10 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
11f20 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
11f30 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
11f40 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
11f50 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
11f60 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
11f70 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
11f80 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
11f90 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
11fa0 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
11fb0 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
11fc0 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
11fd0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
11fe0 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
11ff0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12000 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
12010 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
12020 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
12030 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
12040 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
12050 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
12060 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
12070 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
12080 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
12090 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
120a0 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
120b0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
120c0 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
120d0 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
120e0 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
120f0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12100 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
12110 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
12120 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
12130 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
12140 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
12150 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
12160 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
12170 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
12180 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
12190 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
121a0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
121b0 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
121c0 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
121d0 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
121e0 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
121f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12200 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
12210 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
12220 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
12230 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
12240 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
12250 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
12260 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
12270 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
12280 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
12290 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
122a0 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
122b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
122c0 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
122d0 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
122e0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
122f0 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
12300 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
12310 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
12320 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12330 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
12340 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
12350 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
12360 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
12370 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
12380 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
12390 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
123a0 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
123b0 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
123c0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
123d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
123e0 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
123f0 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
12400 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
12410 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
12420 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
12430 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
12440 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
12450 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
12460 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
12470 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
12480 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
12490 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
124a0 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
124b0 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
124c0 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
124d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
124e0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
124f0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
12500 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
12510 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
12520 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
12530 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
12540 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
12550 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
12560 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
12570 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
12580 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
12590 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
125a0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
125b0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
125c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
125d0 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
125e0 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
125f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
12600 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
12610 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
12620 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
12630 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
12640 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
12650 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
12660 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
12670 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
12680 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
12690 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
126a0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
126b0 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
126c0 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
126d0 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
126e0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
126f0 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
12700 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
12710 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
12720 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
12730 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
12740 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
12750 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
12760 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
12770 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12780 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
12790 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
127a0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
127b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
127c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
127d0 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
127e0 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
127f0 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
12800 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12810 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
12820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12830 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
12840 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
12850 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
12860 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
12870 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
12880 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
12890 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
128a0 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
128b0 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 51 4c 49  e, pSelect, SQLI
128c0 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20  TE_AFF_BLOB);.  
128d0 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
128e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
128f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
12900 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
12910 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
12920 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  ->nCol;.      p-
12930 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
12940 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
12950 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
12960 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
12970 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
12980 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
12990 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
129a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
129b0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
129c0 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
129d0 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
129e0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
129f0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
12a00 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
12a10 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12a20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
12a30 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
12a40 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59  oroutine(v, regY
12a50 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ield);.      sql
12a60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12a70 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29  (v, addrTop - 1)
12a80 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c  ;.      addrInsL
12a90 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
12aa0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12ab0 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72  eld, dest.iSDPar
12ac0 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  m);.      VdbeCo
12ad0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12af0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
12b00 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c  ord, dest.iSdst,
12b10 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67   dest.nSdst, reg
12b20 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
12b30 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
12b40 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (v, p, 0);.     
12b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b60 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
12b70 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 1, regRowid);
12b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12b90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
12ba0 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63  nsert, 1, regRec
12bb0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
12bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
12bd0 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f  to(v, addrInsLoo
12be0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
12bf0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12c00 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
12c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12c20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
12c30 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  se, 1);.    }.. 
12c40 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
12c50 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
12c60 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
12c70 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
12c80 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
12c90 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
12ca0 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
12cb0 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
12cc0 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
12cd0 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
12ce0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
12cf0 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
12d00 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
12d10 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
12d20 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
12d30 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
12d40 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
12d50 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
12d60 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
12d70 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
12d80 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
12d90 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
12da0 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
12db0 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
12dc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
12dd0 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
12de0 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
12df0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
12e00 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
12e10 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
12e20 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
12e30 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
12e40 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
12e50 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
12e60 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
12e70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
12e80 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
12e90 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
12ea0 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
12eb0 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
12ec0 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
12ed0 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
12ee0 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
12ef0 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
12f00 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
12f10 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
12f20 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
12f30 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
12f40 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
12f50 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
12f60 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
12f70 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
12f80 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
12f90 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
12fa0 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
12fb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12fc0 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
12fd0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
12fe0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23  pParse, iDb);..#
12ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13000 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
13010 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
13020 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
13030 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
13040 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
13050 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
13060 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
13070 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
13080 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
13090 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
130a0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
130b0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 44  t)!=0 ){.      D
130c0 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
130d0 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73  b[iDb];.      as
130e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
130f0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
13100 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13110 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
13120 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
13130 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13140 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13150 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
13160 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
13170 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
13180 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
13190 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
131a0 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
131b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
131c0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
131d0 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
131e0 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
131f0 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
13200 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
13210 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
13220 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
13230 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
13240 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13250 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
13260 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
13270 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
13280 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
13290 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
132a0 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
132b0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
132c0 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
132d0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
132e0 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
132f0 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
13300 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
13310 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
13320 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
13330 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
13340 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
13350 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
13360 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
13370 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
13380 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ame, p);.    if(
13390 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
133a0 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
133b0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
133c0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
133d0 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
133e0 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ) */.      sqlit
133f0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
13400 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
13410 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
13420 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
13430 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
13440 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
13450 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 66  Change;..#ifndef
13460 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
13470 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
13480 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
13490 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
134a0 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
134b0 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
134c0 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
134d0 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
134e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
134f0 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
13500 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
13510 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
13520 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
13530 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
13540 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
13550 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
13560 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
13570 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
13580 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
13590 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
135a0 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
135b0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
135c0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
135d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
135e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
135f0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
13600 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
13610 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
13620 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
13630 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
13640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13650 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
13660 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
13670 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
13680 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
13690 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
136a0 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
136b0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
136c0 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
136d0 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
136e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
136f0 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
13700 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
13710 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
13720 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
13730 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 45   the view */.  E
13740 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 73  xprList *pCNames
13750 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 69  , /* Optional li
13760 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 6d  st of view colum
13770 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 6c  n names */.  Sel
13780 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
13790 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
137a0 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
137b0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
137c0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
137d0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
137e0 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
137f0 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
13800 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
13810 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
13820 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
13830 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
13840 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
13850 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
13860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
13870 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
13880 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
13890 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
138a0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
138b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
138c0 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
138d0 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
138e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
138f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
13900 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
13910 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
13920 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  s");.    goto cr
13930 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
13940 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
13950 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
13960 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
13970 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
13980 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
13990 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
139a0 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
139b0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
139c0 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
139d0 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50  l;.  sqlite3TwoP
139e0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
139f0 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
13a00 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
13a10 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13a20 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
13a30 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
13a40 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
13a50 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
13a60 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  w", pName);.  if
13a70 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  ( sqlite3FixSele
13a80 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
13a90 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  t) ) goto create
13aa0 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
13ab0 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
13ac0 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45   the entire SELE
13ad0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
13ae0 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
13af0 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69  ew..  ** This wi
13b00 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65  ll force all the
13b10 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61   Expr.token.z va
13b20 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d  lues to be dynam
13b30 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  ically.  ** allo
13b40 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61  cated rather tha
13b50 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  n point to the i
13b60 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68  nput string - wh
13b70 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  ich means that. 
13b80 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65   ** they will pe
13b90 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20  rsist after the 
13ba0 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f  current sqlite3_
13bb0 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75  exec() call retu
13bc0 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rns..  */.  if( 
13bd0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
13be0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65   ){.    p->pSele
13bf0 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
13c00 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20    pSelect = 0;. 
13c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
13c20 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
13c30 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53  SelectDup(db, pS
13c40 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52  elect, EXPRDUP_R
13c50 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70 2d  EDUCE);.  }.  p-
13c60 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
13c70 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
13c80 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55   pCNames, EXPRDU
13c90 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28  P_REDUCE);.  if(
13ca0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13cb0 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f  d ) goto create_
13cc0 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a  view_fail;..  /*
13cd0 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
13ce0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
13cf0 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
13d00 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
13d10 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
13d20 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
13d30 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
13d40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e 64  ;.  assert( sEnd
13d50 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e 64  .z[0]!=0 || sEnd
13d60 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  .n==0 );.  if( s
13d70 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
13d80 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
13d90 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
13da0 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
13db0 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42  int)(sEnd.z - pB
13dc0 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  egin->z);.  asse
13dd0 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d  rt( n>0 );.  z =
13de0 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
13df0 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
13e00 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e  ace(z[n-1]) ){ n
13e10 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
13e20 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
13e30 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
13e40 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
13e50 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
13e60 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
13e70 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
13e80 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
13e90 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ble(pParse, 0, &
13ea0 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 72  sEnd, 0, 0);..cr
13eb0 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a 0a  eate_view_fail:.
13ec0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13ed0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
13ee0 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  t);.  if( IN_REN
13ef0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
13f00 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45    sqlite3RenameE
13f10 78 70 72 6c 69 73 74 55 6e 6d 61 70 28 70 50 61  xprlistUnmap(pPa
13f20 72 73 65 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20  rse, pCNames);. 
13f30 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
13f40 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
13f50 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75 72  CNames);.  retur
13f60 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n;.}.#endif /* S
13f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
13f80 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
13f90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
13fa0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
13fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13fc0 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54  ALTABLE)./*.** T
13fd0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
13fe0 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61  re pTable is rea
13ff0 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c  lly a VIEW.  Fil
14000 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  l in the names o
14010 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73  f.** the columns
14020 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20   of the view in 
14030 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63  the pTable struc
14040 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68  ture.  Return th
14050 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65  e number.** of e
14060 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
14070 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76  ror is seen leav
14080 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
14090 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
140a0 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
140b0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
140c0 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70  mnNames(Parse *p
140d0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
140e0 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  able){.  Table *
140f0 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20  pSelTab;   /* A 
14100 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20  fake table from 
14110 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65  which we get the
14120 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
14130 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
14140 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68     /* Copy of th
14150 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d  e SELECT that im
14160 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
14170 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20  w */.  int nErr 
14180 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
14190 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
141a0 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e  ountered */.  in
141b0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
141c0 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68  /* Temporarily h
141d0 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20  olds the number 
141e0 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67  of cursors assig
141f0 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
14200 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14210 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  b;  /* Database 
14220 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d  connection for m
14230 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a  alloc errors */.
14240 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14250 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14260 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69  .  int rc;.#endi
14270 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
14280 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
14290 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78 61  ION.  sqlite3_xa
142a0 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20  uth xAuth;      
142b0 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20   /* Saved xAuth 
142c0 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69  pointer */.#endi
142d0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  f..  assert( pTa
142e0 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
142f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14300 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e 6e  UALTABLE.  db->n
14310 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20  SchemaLock++;.  
14320 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
14330 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
14340 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 64  se, pTable);.  d
14350 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d  b->nSchemaLock--
14360 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
14370 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
14380 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
14390 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
143a0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
143b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
143c0 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
143d0 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
143e0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
143f0 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
14400 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
14410 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
14420 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
14430 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
14440 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
14450 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
14460 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
14470 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
14480 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
14490 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
144a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
144b0 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
144c0 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
144d0 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
144e0 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
144f0 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
14500 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
14510 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
14520 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
14530 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
14540 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
14550 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
14560 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
14570 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
14580 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
14590 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
145a0 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
145b0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
145c0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
145d0 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
145e0 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
145f0 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
14600 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
14610 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
14620 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
14630 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
14640 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
14650 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
14660 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
14670 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
14680 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
14690 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
146a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
146b0 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
146c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
146d0 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
146e0 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
146f0 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
14700 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
14710 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
14720 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
14730 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
14740 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
14750 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
14760 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
14770 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
14780 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
14790 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
147a0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
147b0 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
147c0 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
147d0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
147e0 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
147f0 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
14800 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
14810 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
14820 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
14830 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
14840 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
14850 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
14860 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
14870 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
14880 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
14890 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
148a0 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
148b0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
148c0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
148d0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
148e0 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
148f0 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
14900 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
14910 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
14920 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 23 69    if( pSel ){.#i
14930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14940 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
14950 20 75 38 20 65 50 61 72 73 65 4d 6f 64 65 20 3d   u8 eParseMode =
14960 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65 4d   pParse->eParseM
14970 6f 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ode;.    pParse-
14980 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 50 41  >eParseMode = PA
14990 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b  RSE_MODE_NORMAL;
149a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 20 3d 20  .#endif.    n = 
149b0 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
149c0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
149d0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
149e0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63  arse, pSel->pSrc
149f0 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  );.    pTable->n
14a00 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 44 69  Col = -1;.    Di
14a10 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a  sableLookaside;.
14a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14a30 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
14a40 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
14a50 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
14a60 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
14a70 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
14a80 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
14a90 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
14aa0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
14ab0 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
14ac0 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
14ad0 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
14ae0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
14af0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14b00 53 65 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Sel, SQLITE_AFF_
14b10 4e 4f 4e 45 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NONE);.#endif.  
14b20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
14b30 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   n;.    if( pTab
14b40 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20  le->pCheck ){.  
14b50 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49      /* CREATE VI
14b60 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29  EW name(arglist)
14b70 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a   AS ....      **
14b80 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   The names of th
14b90 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
14ba0 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e   table are taken
14bb0 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61   from.      ** a
14bc0 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73 20  rglist which is 
14bd0 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65  stored in pTable
14be0 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70  ->pCheck.  The p
14bf0 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20  Check field.    
14c00 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f    ** normally ho
14c10 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  lds CHECK constr
14c20 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69  aints on an ordi
14c30 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20  nary table, but 
14c40 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56  for.      ** a V
14c50 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65  IEW it holds the
14c60 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20   list of column 
14c70 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  names..      */.
14c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
14c90 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
14ca0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d  (pParse, pTable-
14cb0 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20  >pCheck, .      
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62             &pTab
14ce0 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c  le->nCol, &pTabl
14cf0 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e->aCol);.      
14d00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14d10 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  iled==0 .       
14d20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
14d30 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  =0.       && pTa
14d40 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d  ble->nCol==pSel-
14d50 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
14d60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14d70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
14d80 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
14d90 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
14da0 54 61 62 6c 65 2c 20 70 53 65 6c 2c 0a 20 20 20  Table, pSel,.   
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14de0 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20  TE_AFF_NONE);.  
14df0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
14e00 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
14e10 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
14e20 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20  IEW name AS...  
14e30 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d  without an argum
14e40 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74  ent list.  Const
14e50 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  ruct.      ** th
14e60 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
14e70 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73  rom the SELECT s
14e80 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
14e90 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
14ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
14eb0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
14ec0 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
14ed0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
14ee0 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
14ef0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
14f00 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
14f10 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
14f20 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
14f30 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
14f40 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
14f50 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
14f60 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
14f70 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
14f80 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
14f90 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
14fa0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
14fb0 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
14fc0 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
14fd0 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
14fe0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14ff0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
15000 29 3b 0a 20 20 20 20 45 6e 61 62 6c 65 4c 6f 6f  );.    EnableLoo
15010 6b 61 73 69 64 65 3b 0a 23 69 66 6e 64 65 66 20  kaside;.#ifndef 
15020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
15030 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61 72 73  RTABLE.    pPars
15040 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20  e->eParseMode = 
15050 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65 6e 64  eParseMode;.#end
15060 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  if.  } else {.  
15070 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
15080 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
15090 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
150a0 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
150b0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
150c0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
150d0 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
150e0 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
150f0 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  le);.    pTable-
15100 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >aCol = 0;.    p
15110 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
15120 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
15130 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
15140 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
15150 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
15160 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15170 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
15180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15190 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
151a0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
151b0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
151c0 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
151d0 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
151e0 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
151f0 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
15200 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
15210 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
15220 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
15230 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
15240 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *i;.  assert( sq
15250 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
15260 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29  Held(db, idx, 0)
15270 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73   );.  if( !DbHas
15280 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
15290 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
152a0 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
152b0 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
152c0 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
152d0 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
152e0 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
152f0 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
15300 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
15310 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
15320 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
15330 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
15340 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43    sqlite3DeleteC
15350 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
15360 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
15370 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
15380 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30    pTab->nCol = 0
15390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
153a0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
153b0 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
153c0 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
153d0 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
153e0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
153f0 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
15400 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
15410 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15420 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
15430 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
15440 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
15450 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
15460 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
15470 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
15480 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
15490 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
154a0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
154b0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
154c0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
154d0 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
154e0 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
154f0 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
15500 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
15510 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
15520 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
15530 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
15540 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
15550 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
15560 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
15570 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
15580 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
15590 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
155a0 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
155b0 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
155c0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
155d0 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
155e0 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
155f0 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
15600 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
15610 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
15620 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
15630 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
15640 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
15650 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
15660 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
15670 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
15680 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
15690 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
156a0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
156b0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
156c0 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
156d0 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
156e0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
156f0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
15700 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
15710 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
15720 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
15730 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
15740 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
15750 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
15760 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
15770 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
15780 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
15790 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
157a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
157b0 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74  tPageMoved(sqlit
157c0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
157d0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
157e0 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
157f0 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
15800 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44  *pHash;.  Db *pD
15810 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  b;..  assert( sq
15820 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
15830 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
15840 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
15850 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61  >aDb[iDb];.  pHa
15860 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
15870 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
15880 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
15890 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
158a0 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
158b0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
158c0 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
158d0 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
158e0 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
158f0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
15900 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
15910 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
15920 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
15930 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
15940 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
15950 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
15960 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
15970 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
15980 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
15990 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
159a0 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
159b0 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
159c0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
159d0 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
159e0 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
159f0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
15a00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15a10 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
15a20 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
15a30 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
15a40 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
15a50 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
15a60 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
15a70 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
15a80 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
15a90 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
15aa0 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
15ab0 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
15ac0 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
15ad0 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
15ae0 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
15af0 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
15b00 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
15b10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
15b20 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
15b30 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
15b40 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
15b50 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
15b60 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
15b70 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
15b80 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15b90 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
15ba0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15bb0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 54  Parse);.  if( iT
15bc0 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74 65 33  able<2 ) sqlite3
15bd0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15be0 20 22 63 6f 72 72 75 70 74 20 73 63 68 65 6d 61   "corrupt schema
15bf0 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ");.  sqlite3Vdb
15c00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
15c10 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
15c20 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
15c30 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
15c40 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
15c50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15c60 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
15c70 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
15c80 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
15c90 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
15ca0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
15cb0 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
15cc0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
15cd0 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
15ce0 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
15cf0 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
15d00 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
15d10 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
15d20 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
15d30 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
15d40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
15d50 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
15d60 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
15d70 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
15d80 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
15d90 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
15da0 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
15db0 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
15dc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
15dd0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
15de0 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
15df0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
15e00 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
15e10 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
15e20 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
15e30 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
15e40 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
15e50 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
15e60 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
15e70 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
15e80 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
15e90 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c  ER_NAME, iTable,
15ea0 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
15eb0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
15ec0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15ed0 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
15ee0 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
15ef0 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
15f00 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
15f10 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
15f20 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
15f30 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
15f40 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
15f50 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
15f60 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
15f70 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
15f80 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
15f90 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
15fa0 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
15fb0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
15fc0 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
15fd0 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
15fe0 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
15ff0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
16000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16010 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
16020 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
16030 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49  e *pTab){.  /* I
16040 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
16050 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
16060 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
16070 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16080 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
16090 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
160a0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
160b0 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
160c0 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
160d0 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
160e0 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
160f0 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
16100 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
16110 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
16120 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
16130 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
16140 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
16150 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
16160 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
16170 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
16180 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
16190 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
161a0 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
161b0 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
161c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
161d0 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
161e0 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
161f0 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
16200 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
16210 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
16220 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
16230 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
16240 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16250 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
16260 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
16270 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
16280 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
16290 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
162a0 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
162b0 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
162c0 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
162d0 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
162e0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
162f0 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
16300 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
16310 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
16320 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
16330 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
16340 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
16350 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
16360 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
16370 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
16380 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
16390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
163a0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
163b0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
163c0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
163d0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
163e0 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
163f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
16400 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
16410 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
16420 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
16430 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
16440 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
16450 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
16460 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
16470 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
16480 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
16490 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
164a0 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
164b0 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
164c0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
164d0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
164e0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
164f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16500 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
16510 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
16520 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f  .      destroyRo
16530 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69  otPage(pParse, i
16540 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20  Largest, iDb);. 
16550 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20       iDestroyed 
16560 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20  = iLargest;.    
16570 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
16580 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
16590 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
165a0 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
165b0 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
165c0 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
165d0 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
165e0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
165f0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
16600 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
16610 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16620 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
16630 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
16640 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16660 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
16670 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
16680 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
16690 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
166a0 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
166b0 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
166c0 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
166d0 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
166e0 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
166f0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
16700 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
16710 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
16720 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20   for(i=1; i<=4; 
16730 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  i++){.    char z
16740 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c  Tab[24];.    sql
16750 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
16760 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c  zeof(zTab),zTab,
16770 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c  "sqlite_stat%d",
16780 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
16790 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
167a0 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a  rse->db, zTab, z
167b0 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  DbName) ){.     
167c0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
167d0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
167e0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
167f0 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d   %Q.%s WHERE %s=
16800 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62  %Q",.        zDb
16810 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70  Name, zTab, zTyp
16820 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e, zName.      )
16830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16840 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16850 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  de to drop a tab
16860 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
16870 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
16880 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16890 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74  Table *pTab, int
168a0 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77   iDb, int isView
168b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
168c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
168d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67  arse->db;.  Trig
168e0 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
168f0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
16900 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d  aDb[iDb];..  v =
16910 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
16920 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
16930 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
16940 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
16950 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
16960 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  1, iDb);..#ifnde
16970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
16980 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
16990 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
169a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
169b0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
169c0 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e  VBegin);.  }.#en
169d0 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
169e0 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
169f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
16a00 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
16a10 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69  ped. Code.  ** i
16a20 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
16a30 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
16a40 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
16a50 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c   and/or.  ** sql
16a60 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
16a70 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  if required..  *
16a80 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73  /.  pTrigger = s
16a90 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73  qlite3TriggerLis
16aa0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  t(pParse, pTab);
16ab0 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67  .  while( pTrigg
16ac0 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  er ){.    assert
16ad0 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
16ae0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
16af0 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70  ma || .        p
16b00 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
16b10 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
16b20 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
16b30 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
16b40 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
16b50 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  er);.    pTrigge
16b60 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
16b70 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ext;.  }..#ifnde
16b80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16b90 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a  TOINCREMENT.  /*
16ba0 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
16bb0 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
16bc0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
16bd0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16be0 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
16bf0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
16c00 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
16c10 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
16c20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20  dropped.  ** at 
16c30 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
16c40 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
16c50 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
16c60 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a  le needs to.  **
16c70 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
16c80 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
16c90 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
16ca0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
16cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
16cc0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
16cd0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
16ce0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
16cf0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
16d00 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
16d10 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %Q.sqlite_sequ
16d20 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
16d30 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  %Q",.      pDb->
16d40 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
16d50 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
16d60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
16d70 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
16d80 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
16d90 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
16da0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
16db0 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
16dc0 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
16dd0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
16de0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
16df0 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
16e00 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
16e10 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
16e20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
16e30 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
16e40 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
16e50 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
16e60 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63  d separately bec
16e70 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
16e80 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
16e90 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
16ea0 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
16eb0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
16ec0 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
16ed0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
16ee0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
16ef0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
16f00 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
16f10 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
16f20 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
16f30 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
16f40 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
16f50 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
16f60 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
16f70 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
16f80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
16f90 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62  {.    destroyTab
16fa0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
16fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
16fc0 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
16fd0 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
16fe0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
16ff0 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a   and modify.  **
17000 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
17010 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ie..  */.  if( I
17020 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
17030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
17040 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44  eAddOp4(v, OP_VD
17050 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
17060 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
17070 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d  0);.    sqlite3M
17080 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
17090 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
170a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
170b0 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
170c0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
170d0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
170e0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
170f0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
17100 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
17110 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
17120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
17130 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
17140 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
17150 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
17160 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
17170 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
17180 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
17190 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
171a0 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
171b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
171c0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
171d0 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
171e0 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
171f0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
17200 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
17210 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
17220 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
17230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
17240 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17250 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
17260 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
17270 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
17280 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
17290 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
172a0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
172b0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
172c0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
172d0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
172e0 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
172f0 20 20 61 73 73 65 72 74 28 20 69 73 56 69 65 77    assert( isView
17300 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c  ==0 || isView==L
17310 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20  OCATE_VIEW );.  
17320 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
17330 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
17340 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
17350 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
17360 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
17370 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
17380 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
17390 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
173a0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
173b0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
173c0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
173d0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
173e0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
173f0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
17400 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
17410 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
17420 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
17430 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
17440 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
17450 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
17460 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
17470 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
17480 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
17490 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
174a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
174b0 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
174c0 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
174d0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
174e0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
174f0 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
17500 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
17510 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
17520 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
17530 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
17540 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
17550 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
17560 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
17570 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
17580 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
17590 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
175a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
175b0 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66  Arg2 = 0;.    if
175c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
175d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
175e0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
175f0 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
17600 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
17610 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
17620 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
17630 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
17640 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
17650 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
17660 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
17670 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
17680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
17690 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
176a0 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69  VIEW;.      }.#i
176b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
176c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
176d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
176e0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
176f0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
17700 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b  ITE_DROP_VTABLE;
17710 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73  .      zArg2 = s
17720 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
17730 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d  db, pTab)->pMod-
17740 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20  >zName;.#endif. 
17750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17760 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
17770 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
17780 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
17790 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41  ITE_DROP_TEMP_TA
177a0 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
177b0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
177c0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42   SQLITE_DROP_TAB
177d0 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
177e0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
177f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17800 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a  e, code, pTab->z
17810 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62  Name, zArg2, zDb
17820 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17830 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
17840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
17850 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
17860 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
17870 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61  ELETE, pTab->zNa
17880 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
17890 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
178a0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
178b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
178c0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
178d0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
178e0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
178f0 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53  .    && sqlite3S
17900 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
17910 61 6d 65 2b 37 2c 20 22 73 74 61 74 22 2c 20 34  ame+7, "stat", 4
17920 29 21 3d 30 0a 20 20 20 20 26 26 20 73 71 6c 69  )!=0.    && sqli
17930 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
17940 2d 3e 7a 4e 61 6d 65 2b 37 2c 20 22 70 61 72 61  ->zName+7, "para
17950 6d 65 74 65 72 73 22 2c 20 31 30 29 21 3d 30 20  meters", 10)!=0 
17960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17970 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17980 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
17990 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
179a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
179b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
179c0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
179d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
179e0 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
179f0 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
17a00 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
17a10 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
17a20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
17a30 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
17a40 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
17a50 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
17a60 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17a70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17a80 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
17a90 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
17aa0 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
17ab0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
17ac0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
17ad0 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
17ae0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
17af0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
17b00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17b10 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
17b20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
17b30 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
17b40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17b50 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
17b60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
17b70 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
17b80 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
17b90 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
17ba0 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
17bb0 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
17bc0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
17bd0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
17be0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
17bf0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
17c00 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
17c10 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
17c20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17c30 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
17c40 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
17c50 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
17c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17c70 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
17c80 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
17c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17ca0 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
17cb0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
17cc0 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
17cd0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
17ce0 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
17cf0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
17d00 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
17d10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17d20 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
17d30 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
17d40 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
17d50 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
17d60 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
17d70 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
17d80 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
17d90 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
17da0 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
17db0 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
17dc0 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
17dd0 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
17de0 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
17df0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
17e00 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
17e10 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
17e20 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
17e30 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
17e40 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
17e50 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
17e60 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
17e70 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
17e80 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
17e90 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
17ea0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
17eb0 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
17ec0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
17ed0 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
17ee0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
17ef0 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
17f00 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
17f10 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
17f20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
17f30 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
17f40 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
17f50 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
17f60 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
17f70 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
17f80 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
17f90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
17fa0 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
17fb0 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
17fc0 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
17fd0 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
17fe0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
17ff0 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
18000 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
18010 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
18020 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
18030 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
18040 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
18050 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
18060 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
18070 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
18080 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
18090 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
180a0 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
180b0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
180c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
180d0 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
180e0 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
180f0 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
18100 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
18110 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
18120 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
18130 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
18140 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
18150 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
18160 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
18170 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
18180 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18190 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
181a0 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
181b0 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
181c0 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
181d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
181e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
181f0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
18200 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
18210 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
18220 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
18230 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
18240 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
18250 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
18260 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
18270 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
18280 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
18290 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
182a0 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
182b0 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
182c0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
182d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
182e0 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
182f0 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
18300 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
18310 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
18320 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
18330 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
18340 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
18350 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
18360 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
18370 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
18380 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
18390 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
183a0 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
183b0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
183c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
183d0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
183e0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
183f0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
18400 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
18410 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
18420 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
18430 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
18440 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
18450 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
18460 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
18470 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
18480 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
18490 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
184a0 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
184b0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
184c0 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
184d0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
184e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
184f0 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
18500 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
18510 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18520 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
18530 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
18540 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
18550 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
18560 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
18570 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
18580 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
18590 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
185a0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
185b0 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
185c0 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
185d0 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
185e0 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
185f0 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28  ->zTo = z;.  if(
18600 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
18610 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
18620 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
18630 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
18640 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pTo);.  }.  mem
18650 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
18660 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
18670 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
18680 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
18690 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
186a0 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
186b0 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
186c0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
186d0 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
186e0 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
186f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
18700 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
18710 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
18720 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
18730 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
18740 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
18750 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
18760 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
18770 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
18780 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
18790 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
187a0 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
187b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
187c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
187d0 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
187e0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
187f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18800 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
18810 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
18820 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
18830 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
18840 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
18850 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
18860 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
18870 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
18880 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18890 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
188a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
188b0 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
188c0 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b  map(pParse, &pFK
188d0 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72  ey->aCol[i], pFr
188e0 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
188f0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
18900 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
18910 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
18920 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
18930 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
18940 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
18950 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
18960 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
18970 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
18980 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f  z;.      if( IN_
18990 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
189a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189b0 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
189c0 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43  (pParse, z, pToC
189d0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
189e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
189f0 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
18a00 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
18a10 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
18a20 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
18a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
18a40 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
18a50 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
18a60 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
18a70 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
18a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
18a90 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
18aa0 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
18ab0 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
18ac0 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
18ad0 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
18ae0 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
18af0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
18b00 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
18b10 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
18b20 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
18b30 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
18b40 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
18b50 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
18b60 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
18b70 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
18b80 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
18b90 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
18ba0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
18bb0 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
18bc0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
18bd0 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
18be0 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
18bf0 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
18c00 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
18c10 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
18c20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
18c30 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
18c40 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
18c50 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
18c60 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
18c70 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
18c80 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
18c90 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
18ca0 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
18cb0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
18cc0 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
18cd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
18ce0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
18cf0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
18d00 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
18d10 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
18d20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
18d30 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
18d40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18d50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18d60 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
18d70 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
18d80 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
18d90 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
18da0 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
18db0 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
18dc0 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
18dd0 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
18de0 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
18df0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
18e00 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
18e10 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
18e20 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
18e30 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
18e40 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
18e50 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
18e60 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
18e70 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
18e80 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
18e90 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
18ea0 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
18eb0 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
18ec0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
18ed0 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
18ee0 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
18ef0 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
18f00 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
18f10 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
18f20 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
18f30 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18f40 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
18f50 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
18f60 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
18f70 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
18f80 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
18f90 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
18fa0 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
18fb0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18fc0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
18fd0 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
18fe0 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
18ff0 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
19000 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
19010 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
19020 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
19030 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
19040 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
19050 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
19060 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
19070 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
19080 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
19090 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
190a0 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
190b0 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
190c0 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
190d0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
190e0 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
190f0 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
19100 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
19110 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
19120 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
19130 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
19140 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
19150 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
19160 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
19170 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
19180 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
19190 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
191a0 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
191b0 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
191c0 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
191d0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
191e0 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
191f0 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
19200 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
19210 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
19220 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
19230 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
19240 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
19250 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
19260 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
19270 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
19280 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
19290 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
192a0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
192b0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
192c0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
192d0 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
192e0 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
19310 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
19320 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
19330 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19350 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
19360 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
19370 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19390 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
193a0 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
193b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
193c0 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
193d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
193e0 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
193f0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
19400 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
19410 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
19420 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
19430 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
19440 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
19450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
19460 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
19470 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
19480 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
19490 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
194a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
194b0 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
194c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
194d0 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
194e0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
194f0 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
19500 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
19510 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
19520 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
19530 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
19540 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
19550 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
19560 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
19570 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
19580 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
19590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
195a0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
195b0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
195c0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
195d0 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
195e0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
195f0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
19600 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
19610 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
19620 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
19630 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
19640 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
19650 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
19660 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
19670 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
19680 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
19690 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
196a0 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
196b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
196c0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
196d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
196e0 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
196f0 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
19700 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
19710 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
19720 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
19730 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
19740 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
19750 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
19760 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
19770 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
19780 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
19790 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
197a0 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
197b0 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
197c0 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
197d0 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
197e0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
197f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19800 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
19810 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
19820 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
19830 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
19840 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19850 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
19860 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
19870 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
19880 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
19890 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
198a0 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
198b0 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
198c0 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
198d0 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
198e0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
198f0 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
19900 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
19910 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
19920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19930 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
19940 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
19950 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
19960 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
19970 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
19980 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74  );.  sqlite3Mult
19990 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a  iWrite(pParse);.
199a0 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
199b0 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
199c0 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
199d0 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
199e0 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
199f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19a00 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
19a10 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
19a20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
19a30 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
19a40 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
19a50 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
19a60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19a70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
19a80 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
19a90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19aa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
19ab0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19ac0 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
19ad0 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
19ae0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19af0 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
19b00 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
19b10 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
19b20 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
19b30 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19b50 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
19b60 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
19b70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
19b80 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
19b90 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
19ba0 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
19bb0 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
19bc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19bd0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
19be0 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
19bf0 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
19c00 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  (v);.  if( IsUni
19c10 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
19c20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
19c30 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
19c40 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  (v, 1);.    addr
19c50 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
19c60 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
19c80 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c  rifyAbortable(v,
19c90 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20   OE_Abort);.    
19ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19cb0 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
19cc0 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
19cd0 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
19ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19cf0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
19d00 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
19d10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19d20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
19d30 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
19d40 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
19d50 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
19d60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
19d70 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  j2);.  }else{.  
19d80 20 20 2f 2a 20 4d 6f 73 74 20 43 52 45 41 54 45    /* Most CREATE
19d90 20 49 4e 44 45 58 20 61 6e 64 20 52 45 49 4e 44   INDEX and REIND
19da0 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  EX statements th
19db0 61 74 20 61 72 65 20 6e 6f 74 20 55 4e 49 51 55  at are not UNIQU
19dc0 45 20 63 61 6e 20 6e 6f 74 0a 20 20 20 20 2a 2a  E can not.    **
19dd0 20 61 62 6f 72 74 2e 20 54 68 65 20 65 78 63 65   abort. The exce
19de0 70 74 69 6f 6e 20 69 73 20 69 66 20 6f 6e 65 20  ption is if one 
19df0 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 65  of the indexed e
19e00 78 70 72 65 73 73 69 6f 6e 73 20 63 6f 6e 74 61  xpressions conta
19e10 69 6e 73 20 61 0a 20 20 20 20 2a 2a 20 75 73 65  ins a.    ** use
19e20 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
19e30 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
19e40 69 6f 6e 20 77 68 65 6e 20 69 74 20 69 73 20 65  ion when it is e
19e50 76 61 6c 75 61 74 65 64 2e 20 42 75 74 20 74 68  valuated. But th
19e60 65 0a 20 20 20 20 2a 2a 20 6f 76 65 72 68 65 61  e.    ** overhea
19e70 64 20 6f 66 20 61 64 64 69 6e 67 20 61 20 73 74  d of adding a st
19e80 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
19e90 74 6f 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  to a CREATE INDE
19ea0 58 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 20  X statement is. 
19eb0 20 20 20 2a 2a 20 76 65 72 79 20 73 6d 61 6c 6c     ** very small
19ec0 20 28 73 69 6e 63 65 20 6d 6f 73 74 20 6f 66 20   (since most of 
19ed0 74 68 65 20 70 61 67 65 73 20 77 72 69 74 74 65  the pages writte
19ee0 6e 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  n do not contain
19ef0 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 0a 20 20   content that.  
19f00 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65    ** needs to be
19f10 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65   restored if the
19f20 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 72 74   statement abort
19f30 73 29 2c 20 73 6f 20 77 65 20 63 61 6c 6c 20 0a  s), so we call .
19f40 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 61      ** sqlite3Ma
19f50 79 41 62 6f 72 74 28 29 20 66 6f 72 20 61 6c 6c  yAbort() for all
19f60 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
19f70 61 74 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20  atements.  */.  
19f80 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
19f90 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  t(pParse);.    a
19fa0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
19fb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19fc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
19fd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19fe0 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
19ff0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  ter, regRecord, 
1a000 69 49 64 78 29 3b 0a 20 20 69 66 28 20 21 70 49  iIdx);.  if( !pI
1a010 6e 64 65 78 2d 3e 62 41 73 63 4b 65 79 42 75 67  ndex->bAscKeyBug
1a020 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1a030 4f 50 5f 53 65 65 6b 45 6e 64 20 6f 70 63 6f 64  OP_SeekEnd opcod
1a040 65 20 6d 61 6b 65 73 20 69 6e 64 65 78 20 69 6e  e makes index in
1a050 73 65 72 74 20 66 6f 72 20 61 20 52 45 49 4e 44  sert for a REIND
1a060 45 58 20 67 6f 20 6d 75 63 68 0a 20 20 20 20 2a  EX go much.    *
1a070 2a 20 66 61 73 74 65 72 20 62 79 20 61 76 6f 69  * faster by avoi
1a080 64 69 6e 67 20 75 6e 6e 65 63 65 73 73 61 72 79  ding unnecessary
1a090 20 73 65 65 6b 73 2e 20 20 42 75 74 20 74 68 65   seeks.  But the
1a0a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 64 6f   optimization do
1a0b0 65 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 77 6f  es.    ** not wo
1a0c0 72 6b 20 66 6f 72 20 55 4e 49 51 55 45 20 63 6f  rk for UNIQUE co
1a0d0 6e 73 74 72 61 69 6e 74 20 69 6e 64 65 78 65 73  nstraint indexes
1a0e0 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
1a0f0 44 20 74 61 62 6c 65 73 0a 20 20 20 20 2a 2a 20  D tables.    ** 
1a100 77 69 74 68 20 44 45 53 43 20 70 72 69 6d 61 72  with DESC primar
1a110 79 20 6b 65 79 73 2c 20 73 69 6e 63 65 20 74 68  y keys, since th
1a120 6f 73 65 20 69 6e 64 65 78 65 73 20 68 61 76 65  ose indexes have
1a130 20 74 68 65 72 65 20 6b 65 79 73 20 69 6e 0a 20   there keys in. 
1a140 20 20 20 2a 2a 20 61 20 64 69 66 66 65 72 65 6e     ** a differen
1a150 74 20 6f 72 64 65 72 20 66 72 6f 6d 20 74 68 65  t order from the
1a160 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 20   main table..   
1a170 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 3a 20   ** See ticket: 
1a180 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69  https://www.sqli
1a190 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1a1a0 62 62 61 37 62 36 39 66 39 38 34 39 62 35 62 66  bba7b69f9849b5bf
1a1b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1a1c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a1d0 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64   OP_SeekEnd, iId
1a1e0 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
1a1f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a200 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
1a210 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
1a220 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1a230 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
1a240 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
1a250 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a260 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a270 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
1a280 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a290 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
1a2a0 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
1a2b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a2c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a2d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1a2e0 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
1a2f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
1a300 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
1a310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a320 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
1a330 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
1a340 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
1a350 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
1a360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1a370 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
1a380 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
1a390 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
1a3a0 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
1a3b0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
1a3c0 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
1a3d0 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
1a3e0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
1a3f0 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
1a400 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
1a410 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
1a420 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
1a430 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
1a440 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
1a450 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
1a460 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
1a470 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
1a480 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1a490 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1a4a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1a4b0 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
1a4c0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1a4d0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1a4e0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
1a4f0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1a500 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a510 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
1a520 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
1a530 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
1a540 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
1a550 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
1a560 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
1a570 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
1a580 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1a590 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
1a5a0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
1a5b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1a5c0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
1a5d0 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
1a5e0 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
1a5f0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
1a600 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
1a610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a620 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
1a630 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
1a640 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
1a650 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
1a660 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
1a670 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
1a680 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
1a690 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
1a6a0 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
1a6b0 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
1a6c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1a6d0 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
1a6e0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
1a6f0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
1a700 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
1a710 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1a720 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
1a730 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
1a740 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
1a750 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
1a760 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
1a770 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
1a780 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
1a790 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
1a7a0 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
1a7b0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
1a7c0 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
1a7d0 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
1a7e0 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
1a7f0 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
1a800 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
1a810 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
1a820 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
1a830 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
1a840 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
1a850 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
1a860 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
1a870 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
1a880 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
1a890 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
1a8a0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
1a8b0 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
1a8c0 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
1a8d0 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
1a8e0 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
1a8f0 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
1a900 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
1a910 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1a920 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
1a930 20 6c 69 73 74 20 70 4c 69 73 74 20 63 6f 6e 74   list pList cont
1a940 61 69 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  ains an expressi
1a950 6f 6e 20 74 68 61 74 20 77 61 73 20 70 61 72 73  on that was pars
1a960 65 64 20 77 69 74 68 0a 2a 2a 20 61 6e 20 65 78  ed with.** an ex
1a970 70 6c 69 63 69 74 20 22 4e 55 4c 4c 53 20 46 49  plicit "NULLS FI
1a980 52 53 54 22 20 6f 72 20 22 4e 55 4c 4c 53 20 4c  RST" or "NULLS L
1a990 41 53 54 22 20 63 6c 61 75 73 65 2c 20 6c 65 61  AST" clause, lea
1a9a0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 0a 2a  ve an error in.*
1a9b0 2a 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  * pParse and ret
1a9c0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 4f 74  urn non-zero. Ot
1a9d0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
1a9e0 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  zero..*/.int sql
1a9f0 69 74 65 33 48 61 73 45 78 70 6c 69 63 69 74 4e  ite3HasExplicitN
1aa00 75 6c 6c 73 28 50 61 72 73 65 20 2a 70 50 61 72  ulls(Parse *pPar
1aa10 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
1aa20 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ist){.  if( pLis
1aa30 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
1aa40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1aa50 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1aa60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1aa70 73 74 2d 3e 61 5b 69 5d 2e 62 4e 75 6c 6c 73 20  st->a[i].bNulls 
1aa80 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 73 66  ){.        u8 sf
1aa90 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 73   = pList->a[i].s
1aaa0 6f 72 74 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  ortFlags;.      
1aab0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1aac0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70  g(pParse, "unsup
1aad0 70 6f 72 74 65 64 20 75 73 65 20 6f 66 20 4e 55  ported use of NU
1aae0 4c 4c 53 20 25 73 22 2c 20 0a 20 20 20 20 20 20  LLS %s", .      
1aaf0 20 20 20 20 20 20 28 73 66 3d 3d 30 20 7c 7c 20        (sf==0 || 
1ab00 73 66 3d 3d 33 29 20 3f 20 22 46 49 52 53 54 22  sf==3) ? "FIRST"
1ab10 20 3a 20 22 4c 41 53 54 22 0a 20 20 20 20 20 20   : "LAST".      
1ab20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74    );.        ret
1ab30 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1ab40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ab50 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
1ab60 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
1ab70 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
1ab80 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
1ab90 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
1aba0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
1abb0 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
1abc0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1abd0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
1abe0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
1abf0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
1ac00 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
1ac10 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
1ac20 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
1ac30 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
1ac40 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
1ac50 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
1ac60 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
1ac70 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
1ac80 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
1ac90 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
1aca0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
1acb0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
1acc0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
1acd0 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
1ace0 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
1acf0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1ad00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1ad10 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
1ad20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
1ad30 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
1ad40 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
1ad50 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
1ad60 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
1ad70 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
1ad80 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
1ad90 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
1ada0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
1adb0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
1adc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
1add0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1ade0 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
1adf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ae00 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
1ae10 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
1ae20 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
1ae30 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
1ae40 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
1ae50 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
1ae60 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
1ae70 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
1ae80 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
1ae90 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
1aea0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
1aeb0 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
1aec0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
1aed0 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
1aee0 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
1aef0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1af00 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
1af10 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
1af20 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
1af30 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
1af40 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
1af50 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
1af60 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
1af70 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
1af80 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
1af90 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
1afa0 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61   begins this sta
1afb0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
1afc0 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f   *pPIWhere,    /
1afd0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  * WHERE clause f
1afe0 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63  or partial indic
1aff0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  es */.  int sort
1b000 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
1b010 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
1b020 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
1b030 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
1b040 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20 20  t ifNotExist,   
1b050 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
1b060 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
1b070 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20 69  exists */.  u8 i
1b080 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20 2f  dxType         /
1b090 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70 65  * The index type
1b0a0 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
1b0b0 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
1b0c0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
1b0d0 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
1b0e0 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
1b0f0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
1b100 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
1b110 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
1b120 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1b130 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
1b140 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
1b150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b160 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
1b170 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
1b180 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  j;.  DbFixer sFi
1b190 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
1b1a0 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
1b1b0 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
1b1c0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
1b1d0 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
1b1e0 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
1b1f0 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
1b200 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
1b210 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1b220 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
1b230 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1b240 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
1b250 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1b260 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
1b270 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
1b280 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
1b290 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
1b2a0 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
1b2b0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
1b2c0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
1b2d0 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
1b2e0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
1b2f0 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
1b300 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
1b310 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
1b320 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
1b330 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
1b340 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
1b350 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
1b360 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
1b370 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1b380 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e  zExtra[] */.  in
1b390 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20  t nExtraCol;    
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b3b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1b3c0 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
1b3d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   */.  char *zExt
1b3e0 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
1b3f0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
1b400 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
1b410 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
1b420 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
1b430 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52  ;      /* PRIMAR
1b440 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
1b450 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1b460 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64  bles */..  if( d
1b470 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b480 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
1b490 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
1b4a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b4b0 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45  .  }.  if( IN_DE
1b4c0 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69 64  CLARE_VTAB && id
1b4d0 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1b4e0 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
1b4f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1b500 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b510 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
1b520 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1b530 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1b540 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1b550 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b560 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 48  }.  if( sqlite3H
1b570 61 73 45 78 70 6c 69 63 69 74 4e 75 6c 6c 73 28  asExplicitNulls(
1b580 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 20 29  pParse, pList) )
1b590 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1b5a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b5b0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
1b5c0 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
1b5d0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
1b5e0 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
1b5f0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
1b600 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
1b610 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
1b620 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
1b630 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
1b640 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
1b650 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
1b660 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
1b670 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
1b680 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
1b690 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
1b6a0 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
1b6b0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
1b6c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b6d0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
1b6e0 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
1b6f0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
1b700 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
1b710 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
1b720 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
1b730 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1b740 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
1b750 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e  ert( pName && pN
1b760 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64  ame->z );..#ifnd
1b770 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1b780 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
1b790 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
1b7a0 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
1b7b0 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62  check if the tab
1b7c0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
1b7d0 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
1b7e0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
1b7f0 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
1b800 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
1b810 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
1b820 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1b830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b840 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
1b850 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1b860 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
1b870 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
1b880 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
1b890 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
1b8a0 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
1b8b0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
1b8c0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
1b8d0 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
1b8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1b8f0 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65  ndif..    sqlite
1b900 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
1b910 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
1b920 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  dex", pName);.  
1b930 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
1b940 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
1b950 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  TblName) ){.    
1b960 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
1b970 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
1b980 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
1b990 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
1b9a0 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
1b9b0 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
1b9c0 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
1b9d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b9e0 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
1b9f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
1ba00 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
1ba10 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d  rse, 0, &pTblNam
1ba20 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  e->a[0]);.    as
1ba30 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1ba40 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61  Failed==0 || pTa
1ba50 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
1ba60 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
1ba70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ba80 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
1ba90 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d   && db->aDb[iDb]
1baa0 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e  .pSchema!=pTab->
1bab0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
1bac0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1bad0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1bae0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65       "cannot cre
1baf0 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78  ate a TEMP index
1bb00 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62   on non-TEMP tab
1bb10 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  le \"%s\"",.    
1bb20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1bb30 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
1bb40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1bb50 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1bb60 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
1bb70 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33   ) pPk = sqlite3
1bb80 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
1bb90 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
1bba0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
1bbb0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
1bbc0 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
1bbd0 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
1bbe0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
1bbf0 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
1bc00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1bc10 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
1bc20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1bc30 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
1bc40 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
1bc50 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
1bc60 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
1bc70 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
1bc80 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1bc90 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
1bca0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
1bcb0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
1bcc0 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
1bcd0 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e      && db->init.
1bce0 62 75 73 79 3d 3d 30 0a 20 20 20 20 20 20 20 26  busy==0.       &
1bcf0 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 0a 23 69  & pTblName!=0.#i
1bd00 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
1bd10 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20  THENTICATION.   
1bd20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73      && sqlite3Us
1bd30 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62  erAuthTable(pTab
1bd40 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64  ->zName)==0.#end
1bd50 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1bd60 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41  _ALLOW_SQLITE_MA
1bd70 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20 20  STER_INDEX.     
1bd80 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
1bd90 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
1bda0 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d 30  [7],"master")!=0
1bdb0 0a 23 65 6e 64 69 66 0a 20 29 7b 0a 20 20 20 20  .#endif. ){.    
1bdc0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1bdd0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
1bde0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
1bdf0 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
1be00 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
1be10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1be20 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
1be30 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
1be40 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
1be50 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1be60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1be70 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
1be80 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
1be90 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1bea0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
1beb0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1bec0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1bed0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
1bee0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1bef0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bf00 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
1bf10 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
1bf20 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
1bf30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
1bf40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
1bf50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
1bf60 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
1bf70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1bf80 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
1bf90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
1bfa0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
1bfb0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
1bfc0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
1bfd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
1bfe0 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
1bff0 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
1c000 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
1c010 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
1c020 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
1c030 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
1c040 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
1c050 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
1c060 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
1c070 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
1c080 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
1c090 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
1c0a0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
1c0b0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
1c0c0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
1c0d0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
1c0e0 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
1c0f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1c100 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
1c110 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
1c120 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
1c130 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
1c140 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1c150 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
1c160 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
1c170 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
1c180 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
1c190 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
1c1a0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1c1b0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
1c1c0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
1c1d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c1e0 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
1c1f0 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a   pName->z!=0 );.
1c200 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1c210 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
1c220 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
1c230 2c 20 7a 4e 61 6d 65 2c 22 69 6e 64 65 78 22 2c  , zName,"index",
1c240 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a  pTab->zName) ){.
1c250 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1c260 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1c270 20 20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e 5f    }.    if( !IN_
1c280 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1c290 0a 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e  .      if( !db->
1c2a0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1c2b0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c2c0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
1c2d0 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
1c2e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c2f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c300 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
1c310 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
1c320 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
1c330 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1c340 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1c350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c360 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1c370 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1c380 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53  zName, pDb->zDbS
1c390 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
1c3a0 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
1c3b0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
1c3c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1c3d0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1c3e0 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
1c3f0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1c400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c410 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
1c420 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
1c430 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c440 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1c450 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1c460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c470 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c480 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1c490 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1c4a0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
1c4b0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
1c4c0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
1c4d0 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
1c4e0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
1c4f0 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
1c500 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1c510 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1c520 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
1c530 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
1c540 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
1c550 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
1c560 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c570 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c580 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61  }..    /* Automa
1c590 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  tic index names 
1c5a0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77  generated from w
1c5b0 69 74 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65  ithin sqlite3_de
1c5c0 63 6c 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20  clare_vtab().   
1c5d0 20 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61   ** must have na
1c5e0 6d 65 73 20 74 68 61 74 20 61 72 65 20 64 69 73  mes that are dis
1c5f0 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61  tinct from norma
1c600 6c 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  l automatic inde
1c610 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20  x names..    ** 
1c620 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1c630 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73  atement converts
1c640 20 22 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e   "sqlite3_autoin
1c650 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20  dex..." into.   
1c660 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74   ** "sqlite3_but
1c670 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72  oindex..." in or
1c680 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  der to make the 
1c690 6e 61 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a  names distinct..
1c6a0 20 20 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62      ** The "vtab
1c6b0 5f 65 72 72 2e 74 65 73 74 22 20 74 65 73 74 20  _err.test" test 
1c6c0 64 65 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65  demonstrates the
1c6d0 20 6e 65 65 64 20 6f 66 20 74 68 69 73 20 73 74   need of this st
1c6e0 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  atement. */.    
1c6f0 69 66 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50  if( IN_SPECIAL_P
1c700 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b  ARSE ) zName[7]+
1c710 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  +;.  }..  /* Che
1c720 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
1c730 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
1c740 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
1c750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c760 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1c770 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
1c780 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 63  _OBJECT ){.    c
1c790 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1c7a0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a   pDb->zDbSName;.
1c7b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1c7c0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1c7d0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
1c7e0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1c7f0 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
1c800 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c810 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c820 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
1c830 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
1c840 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1c850 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
1c860 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
1c870 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
1c880 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1c890 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
1c8a0 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
1c8b0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
1c8c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c8d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c8e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1c8f0 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
1c900 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
1c910 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1c920 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
1c930 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
1c940 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
1c950 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
1c960 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
1c970 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
1c980 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
1c990 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
1c9a0 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
1c9b0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1c9c0 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b    Token prevCol;
1c9d0 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  .    Column *pCo
1c9e0 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
1c9f0 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  pTab->nCol-1];. 
1ca00 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
1ca10 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49  s |= COLFLAG_UNI
1ca20 51 55 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  QUE;.    sqlite3
1ca30 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43  TokenInit(&prevC
1ca40 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  ol, pCol->zName)
1ca50 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
1ca60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1ca70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1ca90 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
1caa0 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f  , TK_ID, &prevCo
1cab0 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20  l, 0));.    if( 
1cac0 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
1cad0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1cae0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
1caf0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  List->nExpr==1 )
1cb00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1cb10 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65  rListSetSortOrde
1cb20 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64  r(pList, sortOrd
1cb30 65 72 2c 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e  er, SQLITE_SO_UN
1cb40 44 45 46 49 4e 45 44 29 3b 0a 20 20 7d 65 6c 73  DEFINED);.  }els
1cb50 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1cb60 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
1cb70 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  h(pParse, pList,
1cb80 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 20 20 69   "index");.    i
1cb90 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1cba0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1cbb0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
1cbc0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1cbd0 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
1cbe0 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
1cbf0 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
1cc00 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
1cc10 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
1cc20 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
1cc30 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1cc40 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1cc50 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
1cc60 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
1cc70 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
1cc80 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
1cc90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   );.    if( pExp
1cca0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1ccb0 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72  E ){.      nExtr
1ccc0 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65  a += (1 + sqlite
1ccd0 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d  3Strlen30(pExpr-
1cce0 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20  >u.zToken));.   
1ccf0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20   }.  }..  /* .  
1cd00 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
1cd10 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
1cd20 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d   .  */.  nName =
1cd30 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1cd40 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72  (zName);.  nExtr
1cd50 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b  aCol = pPk ? pPk
1cd60 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20  ->nKeyCol : 1;. 
1cd70 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
1cd80 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f  nExpr + nExtraCo
1cd90 6c 20 3c 3d 20 33 32 37 36 37 20 2f 2a 20 46 69  l <= 32767 /* Fi
1cda0 74 73 20 69 6e 20 69 31 36 20 2a 2f 20 29 3b 0a  ts in i16 */ );.
1cdb0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1cdc0 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
1cdd0 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
1cde0 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
1cdf0 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20            nName 
1ce20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
1ce30 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
1ce40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ce50 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1ce60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1ce70 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
1ce80 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1ce90 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
1cea0 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
1ceb0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1cec0 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
1ced0 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
1cee0 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
1cef0 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
1cf00 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
1cf10 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
1cf20 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
1cf30 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
1cf40 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
1cf50 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1cf60 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
1cf70 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1cf80 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
1cf90 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
1cfa0 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78  x->idxType = idx
1cfb0 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Type;.  pIndex->
1cfc0 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
1cfd0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
1cfe0 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
1cff0 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
1d000 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
1d010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
1d020 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
1d030 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
1d040 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
1d050 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
1d060 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
1d070 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
1d080 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
1d090 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
1d0a0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1d0b0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1d0c0 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
1d0d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
1d0e0 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
1d0f0 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
1d100 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
1d110 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
1d120 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
1d130 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
1d140 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
1d150 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
1d160 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1d170 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
1d180 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
1d190 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
1d1a0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69  * Analyze the li
1d1b0 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
1d1c0 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
1d1d0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
1d1e0 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f  ex and.  ** repo
1d1f0 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20  rt any errors.  
1d200 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  In the common ca
1d210 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78 70  se where the exp
1d220 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74  ression is exact
1d230 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  ly.  ** a table 
1d240 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68  column, store th
1d250 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43  at column in aiC
1d260 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65  olumn[].  For ge
1d270 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  neral expression
1d280 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  s,.  ** populate
1d290 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1d2a0 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45  r and store XN_E
1d2b0 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f  XPR (-2) in aiCo
1d2c0 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  lumn[]..  **.  *
1d2d0 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20  * TODO: Issue a 
1d2e0 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f  warning if two o
1d2f0 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
1d300 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  f the index are 
1d310 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20  identical..  ** 
1d320 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
1d330 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61 62  rning if the tab
1d340 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  le primary key i
1d350 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1d360 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  f the.  ** index
1d370 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69   key..  */.  pLi
1d380 73 74 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e  stItem = pList->
1d390 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  a;.  if( IN_RENA
1d3a0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
1d3b0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1d3c0 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70  r = pList;.    p
1d3d0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  List = 0;.  }.  
1d3e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
1d3f0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c  x->nKeyCol; i++,
1d400 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
1d410 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b     Expr *pCExpr;
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d430 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e    /* The i-th in
1d440 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  dex expression *
1d450 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  /.    int reques
1d460 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20  tedSortOrder;   
1d470 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44       /* ASC or D
1d480 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ESC on the i-th 
1d490 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1d4a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1d4b0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
1d4c0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
1d4d0 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
1d4e0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
1d4f0 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d  gToId(pListItem-
1d500 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
1d510 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
1d520 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
1d530 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70   pTab, NC_IdxExp
1d540 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  r, pListItem->pE
1d550 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  xpr, 0);.    if(
1d560 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
1d570 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1d580 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78  _index;.    pCEx
1d590 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1d5a0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
1d5b0 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1d5c0 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
1d5d0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
1d5e0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1d5f0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1d600 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1d610 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d620 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e  rse, "expression
1d630 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
1d640 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1d650 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72    "UNIQUE constr
1d680 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  aints");.       
1d690 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1d6a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1d6b0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65  .      if( pInde
1d6c0 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29  x->aColExpr==0 )
1d6d0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1d6e0 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69  ->aColExpr = pLi
1d6f0 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  st;.        pLis
1d700 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1d710 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52       j = XN_EXPR
1d720 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1d730 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1d740 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1d750 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1d760 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1d770 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70  .      j = pCExp
1d780 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1d790 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37    assert( j<=0x7
1d7a0 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  fff );.      if(
1d7b0 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j<0 ){.        
1d7c0 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  j = pTab->iPKey;
1d7d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d7e0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
1d7f0 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
1d800 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1d810 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1d820 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1d830 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1d840 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a  = (i16)j;.    }.
1d850 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20      zColl = 0;. 
1d860 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
1d870 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1d880 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1d890 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
1d8a0 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
1d8b0 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54  tem->pExpr->u.zT
1d8c0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  oken;.      nCol
1d8d0 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
1d8e0 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a  n30(zColl) + 1;.
1d8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
1d900 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20  xtra>=nColl );. 
1d910 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74       memcpy(zExt
1d920 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c  ra, zColl, nColl
1d930 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
1d940 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a   zExtra;.      z
1d950 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a  Extra += nColl;.
1d960 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20        nExtra -= 
1d970 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  nColl;.    }else
1d980 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1d990 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
1d9a0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1d9b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
1d9c0 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73  Coll ) zColl = s
1d9d0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1d9e0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
1d9f0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
1da00 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1da10 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
1da20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1da30 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1da40 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1da50 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
1da60 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
1da70 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
1da80 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 46 6c  ListItem->sortFl
1da90 61 67 73 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  ags & sortOrderM
1daa0 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
1dab0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1dac0 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
1dad0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
1dae0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61  /* Append the ta
1daf0 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65  ble key to the e
1db00 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  nd of the index.
1db10 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f    For WITHOUT RO
1db20 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  WID.  ** tables 
1db30 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68  (when pPk!=0) th
1db40 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1db50 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20  eclared PRIMARY 
1db60 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e  KEY.  For.  ** n
1db70 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68  ormal tables (wh
1db80 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20  en pPk==0) this 
1db90 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69  will be the rowi
1dba0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1dbb0 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  k ){.    for(j=0
1dbc0 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1dbd0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1dbe0 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  t x = pPk->aiCol
1dbf0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  umn[j];.      as
1dc00 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
1dc10 20 20 20 20 69 66 28 20 69 73 44 75 70 43 6f 6c      if( isDupCol
1dc20 75 6d 6e 28 70 49 6e 64 65 78 2c 20 70 49 6e 64  umn(pIndex, pInd
1dc30 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  ex->nKeyCol, pPk
1dc40 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , j) ){.        
1dc50 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pIndex->nColumn-
1dc60 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -; .      }else{
1dc70 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1dc80 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e  e( hasColumn(pIn
1dc90 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 70 49  dex->aiColumn,pI
1dca0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 78 29  ndex->nKeyCol,x)
1dcb0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   );.        pInd
1dcc0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1dcd0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
1dce0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1dcf0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
1dd00 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1dd10 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1dd20 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
1dd30 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
1dd40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1dd50 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
1dd60 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1dd70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1dd80 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1dd90 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  i] = XN_ROWID;. 
1dda0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1ddb0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[i] = sqlite3St
1ddc0 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73  rBINARY;.  }.  s
1ddd0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1dde0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
1ddf0 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
1de00 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
1de10 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
1de20 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  dex);..  /* If t
1de30 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  his index contai
1de40 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ns every column 
1de50 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  of its table, th
1de60 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20  en mark.  ** it 
1de70 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1de80 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
1de90 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1dea0 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e  .      || pTab->
1deb0 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74  iPKey<0 || sqlit
1dec0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1ded0 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50  pIndex, pTab->iP
1dee0 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63  Key)>=0 );.  rec
1def0 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
1df00 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b  Indexed(pIndex);
1df10 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
1df20 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43  =0 && pIndex->nC
1df30 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f  olumn>=pTab->nCo
1df40 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  l ){.    pIndex-
1df50 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
1df60 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1df70 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1df80 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  {.      if( j==p
1df90 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e  Tab->iPKey ) con
1dfa0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1dfb0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1dfc0 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e  Index(pIndex,j)>
1dfd0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1dfe0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43       pIndex->isC
1dff0 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20  overing = 0;.   
1e000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e010 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d    }..  if( pTab=
1e020 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1e030 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
1e040 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
1e050 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
1e060 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
1e070 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
1e080 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
1e090 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1e0a0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
1e0b0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1e0c0 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
1e0d0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1e0e0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
1e0f0 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
1e100 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
1e110 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
1e120 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1e130 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1e140 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
1e150 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
1e160 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
1e170 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
1e180 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
1e190 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
1e1a0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
1e1b0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
1e1c0 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
1e1d0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
1e1e0 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
1e1f0 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
1e200 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
1e210 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1e220 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
1e230 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
1e240 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
1e250 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
1e260 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
1e270 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20    **.    ** Two 
1e280 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1e290 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1e2a0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1e2b0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
1e2c0 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70  ** (and thus sup
1e2d0 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63  pressing the sec
1e2e0 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66  ond one) even if
1e2f0 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65   they have diffe
1e300 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74  rent.    ** sort
1e310 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a   orders..    **.
1e320 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
1e330 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f  are different co
1e340 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1e350 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75  s or if the colu
1e360 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  mns of.    ** th
1e370 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63  e constraint occ
1e380 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ur in different 
1e390 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65  orders, then the
1e3a0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1e3b0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1e3c0 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20  ed distinct and 
1e3d0 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73  both result in s
1e3e0 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e  eparate indices.
1e3f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
1e400 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
1e410 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1e420 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
1e430 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
1e440 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1e450 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1e460 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20  Index(pIdx) );. 
1e470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1e480 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1e490 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1e4a0 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  F );.      asser
1e4b0 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1e4c0 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20  (pIndex) );..   
1e4d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
1e4e0 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b  yCol!=pIndex->nK
1e4f0 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
1e500 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
1e510 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   k<pIdx->nKeyCol
1e520 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1e530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
1e540 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1e550 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
1e560 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
1e570 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a  Column[k]>=0 );.
1e580 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1e590 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
1e5a0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1e5b0 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
1e5c0 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
1e5d0 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1e5e0 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
1e5f0 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1e600 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1e610 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
1e620 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1e630 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
1e640 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
1e650 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1e660 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
1e670 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
1e680 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
1e690 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
1e6a0 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
1e6b0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1e6c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1e6d0 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
1e6e0 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
1e6f0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1e700 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
1e710 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
1e720 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1e730 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
1e740 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
1e750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1e760 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
1e770 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
1e780 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
1e790 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
1e7a0 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
1e7b0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
1e7c0 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
1e7d0 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
1e7e0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1e7f0 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
1e800 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20 66  ified behavior f
1e810 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
1e820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e830 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
1e840 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1e850 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
1e860 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
1e870 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
1e880 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e890 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1e8b0 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
1e8c0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
1e8d0 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
1e8e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e8f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1e900 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1e910 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1e920 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
1e930 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1e940 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e960 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c  if( idxType==SQL
1e970 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
1e980 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69  ARYKEY ) pIdx->i
1e990 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
1e9a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 4e  ;.        if( IN
1e9b0 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
1e9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64  {.          pInd
1e9d0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 72  ex->pNext = pPar
1e9e0 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 3b 0a 20  se->pNewIndex;. 
1e9f0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
1ea00 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20 70 49 6e  >pNewIndex = pIn
1ea10 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  dex;.          p
1ea20 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
1ea30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
1ea40 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ea50 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1ea60 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 49   }.  }..  if( !I
1ea70 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1ea80 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20  ){..    /* Link 
1ea90 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
1eaa0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
1eab0 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
1eac0 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 69 6e 2d  other.    ** in-
1ead0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1eae0 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 20  structures. .   
1eaf0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1eb00 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1eb10 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  );.    if( db->i
1eb20 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1eb30 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
1eb40 20 20 61 73 73 65 72 74 28 20 21 49 4e 5f 53 50    assert( !IN_SP
1eb50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 3b 0a 20  ECIAL_PARSE );. 
1eb60 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1eb70 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1eb80 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
1eb90 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
1eba0 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d       if( pTblNam
1ebb0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
1ebc0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1ebd0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1ebe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ebf0 69 74 65 33 49 6e 64 65 78 48 61 73 44 75 70 6c  ite3IndexHasDupl
1ec00 69 63 61 74 65 52 6f 6f 74 50 61 67 65 28 70 49  icateRootPage(pI
1ec10 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
1ec20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ec30 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 76 61  sg(pParse, "inva
1ec40 6c 69 64 20 72 6f 6f 74 70 61 67 65 22 29 3b 0a  lid rootpage");.
1ec50 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
1ec60 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
1ec70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ec80 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1ec90 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1eca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ecb0 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65        p = sqlite
1ecc0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e  3HashInsert(&pIn
1ecd0 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
1ece0 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
1ecf0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1ed00 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20   pIndex);.      
1ed10 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20  if( p ){.       
1ed20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
1ed30 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
1ed40 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1ed50 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  d */.        sql
1ed60 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
1ed70 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1ed80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ed90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eda0 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
1edb0 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
1edc0 6e 67 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nge;.    }..    
1edd0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1ede0 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45  e initial CREATE
1edf0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1ee00 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c   (or CREATE TABL
1ee10 45 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  E if the.    ** 
1ee20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
1ee30 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
1ee40 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1ee50 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1ee60 29 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 65 6d  ) then.    ** em
1ee70 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63  it code to alloc
1ee80 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ate the index ro
1ee90 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61  otpage on disk a
1eea0 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79  nd make an entry
1eeb0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74 68 65 20   for.    ** the 
1eec0 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c  index in the sql
1eed0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1eee0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
1eef0 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 20  e index with.   
1ef00 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75   ** content.  Bu
1ef10 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  t, do not do thi
1ef20 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70  s if we are simp
1ef30 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  ly reading the s
1ef40 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20  qlite_master.   
1ef50 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72   ** table to par
1ef60 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f  se the schema, o
1ef70 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20  r if this index 
1ef80 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  is the PRIMARY K
1ef90 45 59 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  EY index.    ** 
1efa0 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
1efb0 49 44 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ID table..    **
1efc0 0a 20 20 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  .    ** If pTblN
1efd0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1efe0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
1eff0 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d  nerated as an im
1f000 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45  plied PRIMARY KE
1f010 59 0a 20 20 20 20 2a 2a 20 6f 72 20 55 4e 49 51  Y.    ** or UNIQ
1f020 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
1f030 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1f040 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
1f050 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 68 61   table.    ** ha
1f060 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
1f070 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
1f080 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
1f090 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
1f0a0 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 73 74 65  ation.    ** ste
1f0b0 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
1f0c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73  ..    */.    els
1f0d0 65 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70  e if( HasRowid(p
1f0e0 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  Tab) || pTblName
1f0f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 56 64 62  !=0 ){.      Vdb
1f100 65 20 2a 76 3b 0a 20 20 20 20 20 20 63 68 61 72  e *v;.      char
1f110 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 20 20 69   *zStmt;.      i
1f120 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
1f130 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20  se->nMem;..     
1f140 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1f150 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
1f160 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
1f170 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1f180 6e 64 65 78 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ndex;..      sql
1f190 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1f1a0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1f1b0 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 20 20  1, iDb);..      
1f1c0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
1f1d0 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
1f1e0 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61 74  ndex using Creat
1f1f0 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f  eIndex. But befo
1f200 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e  re.      ** doin
1f210 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f  g so, code a Noo
1f220 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  p instruction an
1f230 64 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72  d store its addr
1f240 65 73 73 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ess in .      **
1f250 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69   Index.tnum. Thi
1f260 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  s is required in
1f270 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78   case this index
1f280 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a   is actually a .
1f290 20 20 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59        ** PRIMARY
1f2a0 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74 61 62   KEY and the tab
1f2b0 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  le is actually a
1f2c0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1f2d0 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20 20 20  able. In .      
1f2e0 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65  ** that case the
1f2f0 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
1f300 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f  tRowidTable() ro
1f310 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61  utine will repla
1f320 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ce.      ** the 
1f330 4e 6f 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f  Noop with a Goto
1f340 20 74 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68   to jump over th
1f350 65 20 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65  e VDBE code gene
1f360 72 61 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a  rated below. */.
1f370 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1f380 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  um = sqlite3Vdbe
1f390 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
1f3a0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1f3b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f3c0 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20 69  P_CreateBtree, i
1f3d0 44 62 2c 20 69 4d 65 6d 2c 20 42 54 52 45 45 5f  Db, iMem, BTREE_
1f3e0 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20 20 20 20 20  BLOBKEY);..     
1f3f0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
1f400 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1f410 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
1f420 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
1f430 20 20 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74        ** the zSt
1f440 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
1f450 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
1f460 74 28 20 70 4e 61 6d 65 21 3d 30 20 7c 7c 20 70  t( pName!=0 || p
1f470 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
1f480 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
1f490 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
1f4a0 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c  (int)(pParse->sL
1f4b0 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61  astToken.z - pNa
1f4c0 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d  me->z) + pParse-
1f4d0 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20  >sLastToken.n;. 
1f4e0 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65         if( pName
1f4f0 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
1f500 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n--;.        /* 
1f510 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69  A named index wi
1f520 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43  th an explicit C
1f530 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1f540 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  ement */.       
1f550 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1f560 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
1f570 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
1f580 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ",.            o
1f590 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1f5a0 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1f5b0 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1f5c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f5d0 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d       /* An autom
1f5e0 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74  atic index creat
1f5f0 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20  ed by a PRIMARY 
1f600 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  KEY or UNIQUE co
1f610 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
1f620 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
1f630 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
1f640 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  ); */.        zS
1f650 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
1f660 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61  ..      /* Add a
1f670 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
1f680 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
1f690 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f  s index.      */
1f6a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
1f6b0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1f6c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  , .          "IN
1f6d0 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
1f6e0 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
1f6f0 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
1f700 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
1f710 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
1f720 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
1f730 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1f740 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
1f750 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
1f760 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
1f770 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1f780 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f790 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f7a0 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
1f7b0 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
1f7c0 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
1f7d0 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
1f7e0 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
1f7f0 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a  _Expire.      **
1f800 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
1f810 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
1f820 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
1f830 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1f840 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1f850 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1f860 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1f870 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1f880 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1f890 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1f8a0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
1f8b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1f8c0 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
1f8d0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  b,.            s
1f8e0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1f8f0 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
1f900 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
1f910 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
1f920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f930 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f940 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b 0a  _Expire, 0, 1);.
1f950 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
1f960 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1f970 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  re(v, pIndex->tn
1f980 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  um);.    }.  }..
1f990 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
1f9a0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
1f9b0 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
1f9c0 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
1f9d0 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
1f9e0 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
1f9f0 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
1fa00 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
1fa10 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
1fa20 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
1fa30 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
1fa40 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73  the correct cons
1fa50 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a  traint check.  *
1fa60 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e  * processing (in
1fa70 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
1fa80 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
1fa90 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20  ()) as part of. 
1faa0 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49   ** UPDATE and I
1fab0 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73  NSERT statements
1fac0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  .  .  */.  if( d
1fad0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
1fae0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
1faf0 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
1fb00 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
1fb10 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
1fb20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
1fb30 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1fb40 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
1fb50 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1fb60 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
1fb70 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
1fb80 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
1fb90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fba0 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
1fbb0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1fbc0 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
1fbd0 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
1fbe0 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
1fbf0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
1fc00 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
1fc10 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1fc20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fc30 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1fc40 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1fc50 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
1fc60 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
1fc70 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20   }.    pIndex = 
1fc80 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  0;.  }.  else if
1fc90 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1fca0 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CT ){.    assert
1fcb0 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e  ( pParse->pNewIn
1fcc0 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  dex==0 );.    pP
1fcd0 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20  arse->pNewIndex 
1fce0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49  = pIndex;.    pI
1fcf0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
1fd00 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
1fd10 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
1fd20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1fd30 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
1fd40 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
1fd50 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1fd60 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1fd70 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1fd80 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1fd90 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1fda0 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1fdb0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1fdc0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1fdd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1fde0 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zName);.}../*.**
1fdf0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1fe00 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1fe10 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1fe20 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1fe30 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1fe40 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1fe50 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1fe60 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1fe70 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1fe80 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1fe90 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1fea0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1feb0 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1fec0 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1fed0 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1fee0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1fef0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1ff00 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1ff10 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1ff20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1ff30 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1ff40 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1ff50 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1ff60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1ff70 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1ff80 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1ff90 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1ffa0 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1ffb0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1ffc0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1ffd0 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1ffe0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1fff0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
20000 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
20010 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
20020 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
20030 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
20040 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
20050 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
20060 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
20070 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
20080 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
20090 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
200a0 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
200b0 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
200c0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
200d0 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
200e0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
200f0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
20100 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
20110 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
20120 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
20130 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
20140 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
20150 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
20160 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
20170 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
20180 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
20190 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
201a0 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
201b0 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
201c0 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
201d0 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
201e0 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
201f0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
20200 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e   int i;..  /* In
20210 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61 75  dexes with defau
20220 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73  lt row estimates
20230 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
20240 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20   stat1 data */. 
20250 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e   assert( !pIdx->
20260 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f  hasStat1 );..  /
20270 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
20280 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66  entry (number of
20290 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
202a0 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d  ex) to the estim
202b0 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  ated .  ** numbe
202c0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
202d0 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20   table, or half 
202e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
202f0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  ws in the table.
20300 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69    ** for a parti
20310 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20  al index.   But 
20320 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65  do not let the e
20330 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c  stimate drop bel
20340 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d  ow 10. */.  a[0]
20350 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
20360 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  >nRowLogEst;.  i
20370 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
20380 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d  xWhere!=0 ) a[0]
20390 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28   -= 10;  assert(
203a0 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
203b0 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61  st(2) );.  if( a
203c0 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20  [0]<33 ) a[0] = 
203d0 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  33;             
203e0 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d       assert( 33=
203f0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
20400 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69  0) );..  /* Esti
20410 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69  mate that a[1] i
20420 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c  s 10, a[2] is 9,
20430 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d   a[3] is 8, a[4]
20440 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20   is 7, a[5] is. 
20450 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73   ** 6 and each s
20460 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20  ubsequent value 
20470 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20  (if any) is 5.  
20480 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31  */.  memcpy(&a[1
20490 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73  ], aVal, nCopy*s
204a0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a  izeof(LogEst));.
204b0 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b    for(i=nCopy+1;
204c0 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i<=pIdx->nKeyCo
204d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  l; i++){.    a[i
204e0 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20  ] = 23;         
204f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
20500 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 23==sqlite3Lo
20510 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a  gEst(5) );.  }..
20520 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
20530 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
20540 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
20550 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70  ndex(pIdx) ) a[p
20560 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20  Idx->nKeyCol] = 
20570 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
20580 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
20590 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
205a0 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
205b0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
205c0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
205d0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
205e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
205f0 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
20600 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
20610 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
20620 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
20630 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
20640 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
20650 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20660 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
20670 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
20680 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
20690 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
206a0 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
206b0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
206c0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
206d0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
206e0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
206f0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
20700 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
20710 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
20720 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
20730 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
20740 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
20750 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
20760 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
20770 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
20780 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
20790 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
207a0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
207b0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
207c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
207d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
207e0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
207f0 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
20800 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20810 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
20820 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
20830 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
20840 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
20850 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
20860 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
20870 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
20880 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
20890 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
208a0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
208b0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b  DXTYPE_APPDEF ){
208c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
208d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
208e0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
208f0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
20900 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
20910 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
20920 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
20930 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
20940 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
20950 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
20960 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
20970 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
20980 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
20990 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
209a0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
209b0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
209c0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
209d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
209e0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
209f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
20a00 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
20a10 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
20a20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
20a30 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
20a40 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  E(iDb);.    if( 
20a50 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20a60 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
20a70 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
20a80 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
20a90 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
20aa0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
20ab0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
20ac0 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20  && iDb ) code = 
20ad0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
20ae0 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
20af0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
20b00 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
20b10 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54  Index->zName, pT
20b20 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
20b30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
20b40 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
20b50 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
20b60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
20b70 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
20b80 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d  e index and from
20b90 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
20ba0 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  e */.  v = sqlit
20bb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20bc0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
20bd0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
20be0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
20bf0 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
20c00 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
20c10 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
20c20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
20c30 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d   %Q.%s WHERE nam
20c40 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69  e=%Q AND type='i
20c50 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64  ndex'",.       d
20c60 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
20c70 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
20c80 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  E, pIndex->zName
20c90 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
20ca0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
20cb0 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
20cc0 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  "idx", pIndex->z
20cd0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
20ce0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
20cf0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
20d00 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
20d10 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
20d20 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
20d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20d40 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
20d50 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
20d60 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
20d70 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
20d80 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
20d90 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
20da0 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
20db0 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
20dc0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
20dd0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
20de0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
20df0 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
20e00 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
20e10 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69  size. This routi
20e20 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44  ne uses sqlite3D
20e30 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f  bRealloc().** to
20e40 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61   extend the arra
20e50 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
20e60 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  is space for a n
20e70 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ew object at the
20e80 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   end..**.** When
20e90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20ea0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74  s called, *pnEnt
20eb0 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ry contains the 
20ec0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
20ed0 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e  ** the array (in
20ee0 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68   entries - so th
20ef0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
20f00 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a  ((*pnEntry) * sz
20f10 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20  Entry) bytes.** 
20f20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a  in total)..**.**
20f30 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   If the realloc(
20f40 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  ) is successful 
20f50 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20  (i.e. if no OOM 
20f60 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
20f70 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ), the.** space 
20f80 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
20f90 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
20fa0 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79  zeroed, *pnEntry
20fb0 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72   updated to.** r
20fc0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
20fd0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
20fe0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
20ff0 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  o the new alloca
21000 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64  tion.** returned
21010 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  . *pIdx is set t
21020 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
21030 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74  he new array ent
21040 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
21050 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
21060 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  , if the realloc
21070 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20  () fails, *pIdx 
21080 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70  is set to -1, *p
21090 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a  nEntry remains.*
210a0 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
210b0 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79  a copy of pArray
210c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f   returned..*/.vo
210d0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
210e0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
210f0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
21100 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
21110 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
21120 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
21130 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
21140 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
21150 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
21160 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
21170 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
21180 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
21190 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
211a0 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
211b0 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
211c0 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
211d0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
211e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
211f0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
21200 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
21210 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
21220 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
21230 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
21240 20 6e 20 3d 20 2a 70 49 64 78 20 3d 20 2a 70 6e   n = *pIdx = *pn
21250 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
21260 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
21270 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
21280 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
21290 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
212a0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
212b0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
212c0 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
212d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
212e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
212f0 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
21300 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
21310 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
21320 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
21330 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
21340 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
21350 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
21360 74 72 79 29 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74  try);.  ++*pnEnt
21370 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
21380 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
21390 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
213a0 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
213b0 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
213c0 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
213d0 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
213e0 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
213f0 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
21400 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
21410 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
21420 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
21430 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61  ppend(Parse *pPa
21440 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  rse, IdList *pLi
21450 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
21460 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  n){.  sqlite3 *d
21470 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21480 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
21490 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
214a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
214b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
214c0 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
214d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
214e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
214f0 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
21500 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
21510 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
21520 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
21530 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
21540 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
21550 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
21560 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
21570 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
21580 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
21590 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
215a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
215b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
215c0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
215d0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
215e0 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52  ken);.  if( IN_R
215f0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20  ENAME_OBJECT && 
21600 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
21610 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
21620 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
21630 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c  Parse, (void*)pL
21640 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
21650 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
21660 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
21670 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
21680 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
21690 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
216a0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
216b0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
216c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
216d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
216e0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
216f0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
21700 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
21710 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
21720 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
21730 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
21740 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
21750 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
21760 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
21770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21780 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
21790 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
217a0 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
217b0 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
217c0 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
217d0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
217e0 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
217f0 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
21800 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
21810 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
21820 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
21830 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
21840 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
21850 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
21860 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
21870 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
21880 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
21890 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
218a0 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a  *.** Maximum siz
218b0 65 20 6f 66 20 61 20 53 72 63 4c 69 73 74 20 6f  e of a SrcList o
218c0 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 53 72  bject..** The Sr
218d0 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 69 73 20  cList object is 
218e0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
218f0 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  t the FROM claus
21900 65 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  e of a.** SELECT
21910 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20   statement, and 
21920 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
21930 72 20 63 61 6e 6e 6f 74 20 64 65 61 6c 20 77 69  r cannot deal wi
21940 74 68 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  th more.** than 
21950 36 34 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  64 tables in a j
21960 6f 69 6e 2e 20 20 53 6f 20 61 6e 79 20 76 61 6c  oin.  So any val
21970 75 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36  ue larger than 6
21980 34 20 68 65 72 65 0a 2a 2a 20 69 73 20 73 75 66  4 here.** is suf
21990 66 69 63 69 65 6e 74 20 66 6f 72 20 6d 6f 73 74  ficient for most
219a0 20 75 73 65 73 2e 20 20 53 6d 61 6c 6c 65 72 20   uses.  Smaller 
219b0 76 61 6c 75 65 73 2c 20 6c 69 6b 65 20 73 61 79  values, like say
219c0 20 31 30 2c 20 61 72 65 0a 2a 2a 20 61 70 70 72   10, are.** appr
219d0 6f 70 72 69 61 74 65 20 66 6f 72 20 73 6d 61 6c  opriate for smal
219e0 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69 6d  l and memory-lim
219f0 69 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ited application
21a00 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
21a10 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54  LITE_MAX_SRCLIST
21a20 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
21a30 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 32 30 30  _MAX_SRCLIST 200
21a40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
21a50 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
21a60 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
21a70 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
21a80 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
21a90 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
21aa0 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
21ab0 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
21ac0 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
21ad0 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
21ae0 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
21af0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
21b00 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
21b10 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
21b20 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
21b30 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
21b40 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
21b50 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
21b60 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
21b70 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
21b80 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
21b90 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
21ba0 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
21bb0 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
21bc0 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
21bd0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
21be0 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
21bf0 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
21c00 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
21c10 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
21c20 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
21c30 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
21c40 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
21c50 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
21c60 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
21c70 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
21c80 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
21c90 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
21ca0 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
21cb0 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
21cc0 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
21cd0 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20  cation fails or 
21ce0 74 68 65 20 53 72 63 4c 69 73 74 20 62 65 63 6f  the SrcList beco
21cf0 6d 65 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 6c  mes too large, l
21d00 65 61 76 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67  eave.** the orig
21d10 69 6e 61 6c 20 53 72 63 4c 69 73 74 20 75 6e 63  inal SrcList unc
21d20 68 61 6e 67 65 64 2c 20 72 65 74 75 72 6e 20 4e  hanged, return N
21d30 55 4c 4c 2c 20 61 6e 64 20 6c 65 61 76 65 20 61  ULL, and leave a
21d40 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
21d50 2a 2a 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ** in pParse..*/
21d60 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
21d70 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
21d80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21d90 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
21da0 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68   context into wh
21db0 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20 72  ich errors are r
21dc0 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63  eported */.  Src
21dd0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
21de0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
21df0 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
21e00 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
21e10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21e20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
21e30 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
21e40 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
21e50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
21e60 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
21e70 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
21e80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
21e90 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
21ea0 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
21eb0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
21ec0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
21ed0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
21ee0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
21ef0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
21f00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21f10 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
21f20 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
21f30 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
21f40 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
21f50 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
21f60 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
21f70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
21f80 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
21f90 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
21fa0 20 6e 41 6c 6c 6f 63 20 3d 20 32 2a 28 73 71 6c   nAlloc = 2*(sql
21fb0 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72 63 2d  ite3_int64)pSrc-
21fc0 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20  >nSrc+nExtra;.  
21fd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21fe0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 20  pParse->db;..   
21ff0 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b   if( pSrc->nSrc+
22000 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45 5f 4d  nExtra>=SQLITE_M
22010 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a 20 20  AX_SRCLIST ){.  
22020 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
22030 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
22040 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73   many FROM claus
22050 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20 25 64  e terms, max: %d
22060 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22070 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22080 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a 20 20  MAX_SRCLIST);.  
22090 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
220a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 6c 6c    }.    if( nAll
220b0 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52  oc>SQLITE_MAX_SR
220c0 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63 20 3d  CLIST ) nAlloc =
220d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c   SQLITE_MAX_SRCL
220e0 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  IST;.    pNew = 
220f0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
22100 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
22110 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
22120 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
22130 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
22140 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
22150 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22160 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
22170 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
22180 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
22190 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
221a0 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72 63 2d   pNew;.    pSrc-
221b0 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63  >nAlloc = nAlloc
221c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
221d0 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
221e0 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
221f0 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
22200 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
22210 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
22220 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
22230 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
22240 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
22250 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
22260 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
22270 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
22280 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
22290 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
222a0 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
222b0 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
222c0 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
222d0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
222e0 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
222f0 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
22300 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
22310 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
22320 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
22330 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
22340 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
22350 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
22360 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
22370 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
22380 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
22390 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
223a0 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
223b0 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
223c0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
223d0 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
223e0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
223f0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
22400 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
22410 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
22420 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
22430 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
22440 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72 20 69  n OOM error or i
22450 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69 73 74  f the.** SrcList
22460 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67 65 2e   grows to large.
22470 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
22480 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
22490 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
224a0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
224b0 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
224c0 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
224d0 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
224e0 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
224f0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
22500 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
22510 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
22520 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
22530 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
22540 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
22550 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
22560 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
22570 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
22580 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
22590 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
225a0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
225b0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
225c0 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
225d0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
225e0 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
225f0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
22600 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
22610 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
22620 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
22630 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
22640 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
22650 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
22660 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
22670 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
22680 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
22690 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
226a0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
226b0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
226c0 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
226d0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
226e0 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
226f0 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
22700 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
22710 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
22720 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
22730 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
22740 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
22750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
22760 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
22770 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
22780 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
22790 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
227a0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
227b0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
227c0 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
227d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
227e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
227f0 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
22800 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
22810 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
22820 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
22830 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
22840 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
22850 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
22860 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
22870 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
22880 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
22890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
228a0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
228b0 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
228c0 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
228d0 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
228e0 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
228f0 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
22900 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
22910 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
22920 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
22930 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
22940 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
22950 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
22960 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22970 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20 65 72  ext, in which er
22980 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72 74 65  rors are reporte
22990 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  d */.  SrcList *
229a0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
229b0 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
229c0 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
229d0 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
229e0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
229f0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
22a00 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
22a10 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
22a20 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
22a30 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
22a40 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
22a50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
22a60 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
22a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  ;.  assert( pDat
22a80 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62  abase==0 || pTab
22a90 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e  le!=0 );  /* Can
22aa0 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f  not have C witho
22ab0 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65 72 74  ut B */.  assert
22ac0 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
22ad0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
22ae0 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  >db!=0 );.  db =
22af0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
22b00 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
22b10 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
22b20 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
22b30 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
22b40 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
22b50 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
22b60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
22b70 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
22b80 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53  1;.    pList->nS
22b90 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73  rc = 1;.    mems
22ba0 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c  et(&pList->a[0],
22bb0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
22bc0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c  ->a[0]));.    pL
22bd0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
22be0 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  r = -1;.  }else{
22bf0 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
22c00 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ew = sqlite3SrcL
22c10 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61 72 73  istEnlarge(pPars
22c20 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  e, pList, 1, pLi
22c30 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20 20 69  st->nSrc);.    i
22c40 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22c50 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
22c60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
22c70 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
22c80 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
22c90 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e        pList = pN
22ca0 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ew;.    }.  }.  
22cb0 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
22cc0 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
22cd0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
22ce0 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
22cf0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
22d00 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
22d10 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
22d20 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
22d30 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
22d40 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
22d50 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49  atabase);.    pI
22d60 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
22d70 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
22d80 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
22d90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22da0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
22db0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
22dc0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
22dd0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
22de0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
22df0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
22e00 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
22e10 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
22e20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
22e30 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
22e40 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
22e50 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
22e60 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
22e70 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
22e80 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
22e90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22ea0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
22eb0 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
22ec0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
22ed0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
22ee0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
22ef0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
22f00 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
22f10 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
22f20 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
22f30 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
22f40 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
22f50 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
22f60 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
22f70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
22f80 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
22f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
22fa0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
22fb0 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
22fc0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
22fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22fe0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
22ff0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
23000 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
23010 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
23020 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
23030 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
23040 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
23050 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
23060 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
23070 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23080 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
23090 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
230a0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
230b0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
230c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
230d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
230e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
230f0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
23100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
23110 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
23120 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
23130 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
23140 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
23150 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
23160 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c  sIndexedBy ) sql
23170 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23180 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
23190 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  dBy);.    if( pI
231a0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
231b0 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  c ) sqlite3ExprL
231c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
231d0 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
231e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
231f0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
23200 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
23210 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
23220 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
23230 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
23240 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
23250 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
23260 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
23270 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
23280 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
23290 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
232a0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
232b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
232c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
232d0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
232e0 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
232f0 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
23300 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
23310 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
23320 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
23330 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
23340 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
23350 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
23360 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
23370 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
23380 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
23390 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
233a0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
233b0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
233c0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
233d0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
233e0 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
233f0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
23400 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
23410 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
23420 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
23430 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
23440 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
23450 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
23460 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
23470 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
23480 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
23490 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
234a0 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
234b0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
234c0 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
234d0 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
234e0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
234f0 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
23500 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
23510 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
23520 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
23530 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
23540 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
23550 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
23560 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
23570 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
23580 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
23590 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
235a0 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
235b0 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
235c0 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
235d0 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
235e0 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
235f0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
23600 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
23610 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
23620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
23630 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
23640 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
23650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23660 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
23670 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
23680 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
23690 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
236a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
236b0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
236c0 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
236d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
236e0 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
236f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
23700 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
23710 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
23720 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
23730 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
23740 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
23750 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
23760 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
23770 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
23780 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
23790 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
237a0 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
237b0 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
237c0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
237d0 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
237e0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
237f0 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
23800 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
23810 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
23820 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
23830 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23840 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
23850 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
23860 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
23870 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
23880 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
23890 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
238a0 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
238b0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
238c0 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
238d0 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
238e0 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
238f0 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
23900 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
23910 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
23920 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23930 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61  p, pTable, pData
23940 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
23950 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  0 ){.    goto ap
23960 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
23970 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23980 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49  ->nSrc>0 );.  pI
23990 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
239a0 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
239b0 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28  ( (pTable==0)==(
239c0 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20 29 3b  pDatabase==0) );
239d0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d  .  assert( pItem
239e0 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44  ->zName==0 || pD
239f0 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a 20 20  atabase!=0 );.  
23a00 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
23a10 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a  JECT && pItem->z
23a20 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  Name ){.    Toke
23a30 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57  n *pToken = (ALW
23a40 41 59 53 28 70 44 61 74 61 62 61 73 65 29 20 26  AYS(pDatabase) &
23a50 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 29 20  & pDatabase->z) 
23a60 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20 70 54  ? pDatabase : pT
23a70 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  able;.    sqlite
23a80 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
23a90 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a  pParse, pItem->z
23aa0 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  Name, pToken);. 
23ab0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c   }.  assert( pAl
23ac0 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ias!=0 );.  if( 
23ad0 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
23ae0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
23af0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
23b00 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
23b10 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
23b20 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
23b30 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
23b40 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
23b50 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
23b60 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a  g;.  return p;..
23b70 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
23b80 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d  or:.  assert( p=
23b90 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
23ba0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  xprDelete(db, pO
23bb0 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
23bc0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
23bd0 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  sing);.  sqlite3
23be0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
23bf0 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72   pSubquery);.  r
23c00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
23c10 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44  * Add an INDEXED
23c20 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58   BY or NOT INDEX
23c30 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ED clause to the
23c40 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
23c50 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74  dded .** element
23c60 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   of the source-l
23c70 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
23c80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23c90 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
23ca0 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
23cb0 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
23cc0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f  , SrcList *p, To
23cd0 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29  ken *pIndexedBy)
23ce0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  {.  assert( pInd
23cf0 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69  exedBy!=0 );.  i
23d00 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 65 64  f( p && pIndexed
23d10 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73  By->n>0 ){.    s
23d20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23d30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
23d40 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30  ssert( p->nSrc>0
23d50 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20   );.    pItem = 
23d60 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
23d70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
23d80 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
23d90 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
23da0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
23db0 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
23dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
23dd0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
23de0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
23df0 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20  IndexedBy->n==1 
23e00 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e  && !pIndexedBy->
23e10 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  z ){.      /* A 
23e20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c  "NOT INDEXED" cl
23e30 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65  ause was supplie
23e40 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a  d. See parse.y .
23e50 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75        ** constru
23e60 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22  ct "indexed_opt"
23e70 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
23e80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
23e90 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b  .notIndexed = 1;
23ea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23eb0 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64    pItem->u1.zInd
23ec0 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
23ed0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
23ee0 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
23ef0 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74  edBy);.      pIt
23f00 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
23f10 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  By = 1;.    }.  
23f20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  }.}../*.** Add t
23f30 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74  he list of funct
23f40 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ion arguments to
23f50 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74   the SrcList ent
23f60 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c  ry for a.** tabl
23f70 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f  e-valued-functio
23f80 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
23f90 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67  e3SrcListFuncArg
23fa0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
23fb0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70   SrcList *p, Exp
23fc0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
23fd0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74   if( p ){.    st
23fe0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23ff0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
24000 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
24010 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
24020 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  fg.notIndexed==0
24030 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24040 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
24050 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  xedBy==0 );.    
24060 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
24070 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29  g.isTabFunc==0 )
24080 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e  ;.    pItem->u1.
24090 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74  pFuncArg = pList
240a0 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e  ;.    pItem->fg.
240b0 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20  isTabFunc = 1;. 
240c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
240d0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
240e0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
240f0 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ist);.  }.}../*.
24100 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67  ** When building
24110 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   up a FROM claus
24120 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c  e in the parser,
24130 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
24140 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  or.** is initial
24150 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ly attached to t
24160 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e  he left operand.
24170 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67    But the code g
24180 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65  enerator.** expe
24190 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  cts the join ope
241a0 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74  rator to be on t
241b0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
241c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
241d0 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f  ** Shifts all jo
241e0 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f  in operators fro
241f0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
24200 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52  for an entire FR
24210 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a  OM.** clause..**
24220 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70  .** Example: Sup
24230 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73  pose the join is
24240 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
24250 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61  *           A na
24260 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
24270 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65   B.**.** The ope
24280 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61  rator is "natura
24290 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20  l cross join".  
242a0 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72  The A and B oper
242b0 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ands are stored.
242c0 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e  ** in p->a[0] an
242d0 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65  d p->a[1], respe
242e0 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61  ctively.  The pa
242f0 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  rser initially s
24300 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65  tores the.** ope
24310 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54  rator with A.  T
24320 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66  his routine shif
24330 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72  ts that operator
24340 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76   over to B..*/.v
24350 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
24360 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28  stShiftJoinType(
24370 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69  SrcList *p){.  i
24380 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
24390 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  i;.    for(i=p->
243a0 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  nSrc-1; i>0; i--
243b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  ){.      p->a[i]
243c0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  .fg.jointype = p
243d0 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e  ->a[i-1].fg.join
243e0 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  type;.    }.    
243f0 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[0].fg.joint
24400 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
24410 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
24420 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42  DBE code for a B
24430 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a  EGIN statement..
24440 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
24450 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
24460 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
24470 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
24480 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
24490 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
244a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
244b0 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
244c0 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
244d0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
244e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
244f0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
24500 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
24510 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a  EGIN", 0, 0) ){.
24520 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
24530 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
24540 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
24550 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
24560 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
24570 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
24580 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
24590 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
245a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
245b0 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  2(v, OP_Transact
245c0 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
245d0 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
245e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
245f0 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
24600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
24610 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
24620 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
24630 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
24640 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
24650 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  for a COMMIT or 
24660 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65  ROLLBACK stateme
24670 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  nt..** Code for 
24680 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65  ROLLBACK is gene
24690 72 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d  rated if eType==
246a0 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74  TK_ROLLBACK.  Ot
246b0 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20  herwise.** code 
246c0 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  is generated for
246d0 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f   a COMMIT..*/.vo
246e0 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61  id sqlite3EndTra
246f0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
24700 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70  pParse, int eTyp
24710 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  e){.  Vdbe *v;. 
24720 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b   int isRollback;
24730 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
24740 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
24750 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
24760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54   );.  assert( eT
24770 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c  ype==TK_COMMIT |
24780 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20  | eType==TK_END 
24790 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c  || eType==TK_ROL
247a0 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c  LBACK );.  isRol
247b0 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54  lback = eType==T
247c0 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66  K_ROLLBACK;.  if
247d0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
247e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
247f0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a  E_TRANSACTION, .
24800 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63         isRollbac
24810 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a  k ? "ROLLBACK" :
24820 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
24830 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
24840 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
24850 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
24860 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
24870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24880 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
24890 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61  mit, 1, isRollba
248a0 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ck);.  }.}../*.*
248b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
248c0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
248d0 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
248e0 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
248f0 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
24900 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
24910 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
24920 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
24930 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
24940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
24950 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
24960 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
24970 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
24980 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
24990 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
249a0 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
249b0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
249c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
249d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
249e0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
249f0 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
24a00 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
24a10 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  st az[] = { "BEG
24a20 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
24a30 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
24a40 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
24a50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
24a60 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
24a70 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
24a80 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
24a90 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
24aa0 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
24ab0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
24ac0 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
24ad0 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
24ae0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24af0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
24b00 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
24b10 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
24b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24b30 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
24b40 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
24b50 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
24b60 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
24b70 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24b80 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
24b90 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
24ba0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
24bb0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
24bc0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
24bd0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
24be0 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
24bf0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
24c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
24c10 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
24c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
24c30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24c40 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
24c50 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
24c60 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
24c70 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
24c80 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
24c90 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69   *pBt;.    stati
24ca0 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
24cb0 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
24cc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24cd0 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
24ce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
24cf0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
24d00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
24d10 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
24d20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
24d30 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
24d40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
24d50 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
24d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24d70 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
24d80 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30  , 0, db, &pBt, 0
24d90 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
24da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24db0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24dc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24dd0 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
24de0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
24df0 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
24e00 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
24e10 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
24e20 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
24e30 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
24e40 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
24e50 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31   }.    db->aDb[1
24e60 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ].pBt = pBt;.   
24e70 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
24e80 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
24e90 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
24ea0 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
24eb0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
24ec0 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
24ed0 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20  ze, -1, 0) ){.  
24ee0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
24ef0 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ult(db);.      r
24f00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
24f10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
24f20 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
24f30 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
24f40 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77   schema cookie w
24f50 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76  ill need to be v
24f60 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64  erified.** for d
24f70 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68  atabase iDb.  Th
24f80 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c  e code to actual
24f90 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ly verify the sc
24fa0 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77  hema cookie.** w
24fb0 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65  ill occur at the
24fc0 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d   end of the top-
24fd0 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77  level VDBE and w
24fe0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
24ff0 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71  .** later, by sq
25000 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
25010 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g()..*/.void sql
25020 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
25030 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
25040 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
25050 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
25060 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
25070 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
25080 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
25090 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65  =0 && iDb<pParse
250a0 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  ->db->nDb );.  a
250b0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
250c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
250d0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
250e0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
250f0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
25100 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D+2 );.  assert(
25110 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
25120 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e  texHeld(pParse->
25130 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
25140 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28   if( DbMaskTest(
25150 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
25160 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29  eMask, iDb)==0 )
25170 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
25180 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
25190 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20  eMask, iDb);.   
251a0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
251b0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
251c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
251d0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
251e0 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  plevel);.    }. 
251f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
25200 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
25210 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
25220 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
25230 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
25240 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
25250 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
25260 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
25270 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
25280 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
25290 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
252a0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
252b0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
252c0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
252d0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
252e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
252f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
25300 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
25310 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
25320 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
25330 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
25340 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
25350 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
25360 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  zDb, pDb->zDbSNa
25370 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  me)) ){.      sq
25380 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
25390 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
253a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
253b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
253c0 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
253d0 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
253e0 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
253f0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
25400 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
25410 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25420 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
25430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
25440 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
25450 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
25460 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
25470 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
25480 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
25490 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
254a0 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
254b0 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
254c0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
254d0 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
254e0 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
254f0 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
25500 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
25510 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
25520 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
25530 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
25540 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
25550 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
25560 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
25570 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
25580 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
25590 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
255a0 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
255b0 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
255c0 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
255d0 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
255e0 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
255f0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
25600 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
25610 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
25620 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
25630 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
25640 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
25650 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
25660 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
25670 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
25680 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
25690 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
256a0 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
256b0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
256c0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
256d0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
256e0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
256f0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
25700 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70    DbMaskSet(pTop
25710 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b  level->writeMask
25720 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65  , iDb);.  pTople
25730 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
25740 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
25750 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
25760 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
25770 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
25780 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
25790 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
257a0 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
257b0 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
257c0 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
257d0 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
257e0 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
257f0 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
25800 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
25810 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
25820 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
25830 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
25840 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
25850 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
25860 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
25870 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
25880 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
25890 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
258a0 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
258b0 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
258c0 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
258d0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
258e0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
258f0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
25900 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
25910 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
25920 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
25930 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
25940 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
25950 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
25960 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
25970 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
25980 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
25990 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
259a0 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
259b0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
259c0 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
259d0 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
259e0 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
259f0 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
25a00 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
25a10 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
25a20 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
25a30 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
25a40 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
25a50 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
25a60 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
25a70 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
25a80 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
25a90 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
25aa0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
25ab0 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
25ac0 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
25ad0 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
25ae0 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
25af0 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
25b00 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
25b10 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
25b20 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
25b30 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
25b40 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
25b50 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
25b60 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
25b70 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
25b80 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
25b90 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
25ba0 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
25bb0 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
25bc0 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
25bd0 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
25be0 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
25bf0 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
25c00 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
25c10 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
25c20 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
25c30 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
25c40 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
25c50 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
25c60 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
25c70 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
25c80 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
25c90 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
25ca0 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
25cb0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
25cc0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
25cd0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
25ce0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
25cf0 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
25d00 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
25d10 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
25d20 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
25d30 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
25d40 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
25d50 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
25d60 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
25d70 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
25d80 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
25d90 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
25da0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
25db0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
25dc0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
25dd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
25de0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ltConstraint(.  
25df0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
25e00 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
25e10 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72  text */.  int er
25e20 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65  rCode,      /* e
25e30 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f  xtended error co
25e40 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  de */.  int onEr
25e50 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
25e60 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
25e70 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20    char *p4,     
25e80 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
25e90 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74  sage */.  i8 p4t
25ea0 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ype,        /* P
25eb0 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54  4_STATIC or P4_T
25ec0 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38  RANSIENT */.  u8
25ed0 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20   p5Errmsg       
25ee0 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70  /* P5_ErrMsg typ
25ef0 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
25f00 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
25f10 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
25f20 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30  sert( (errCode&0
25f30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
25f40 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28  STRAINT );.  if(
25f50 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
25f60 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
25f70 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
25f80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25f90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
25fa0 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20  _Halt, errCode, 
25fb0 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20  onError, 0, p4, 
25fc0 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74  p4type);.  sqlit
25fd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
25fe0 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  , p5Errmsg);.}..
25ff0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
26000 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49  _Halt due to UNI
26010 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
26020 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  EY constraint vi
26030 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  olation..*/.void
26040 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
26050 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
26060 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
26070 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
26080 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
26090 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
260a0 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
260b0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
260c0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
260d0 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65  hat triggers the
260e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
260f0 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
26100 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63    int j;.  StrAc
26110 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61  cum errMsg;.  Ta
26120 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
26130 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c  ->pTable;..  sql
26140 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
26150 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65  (&errMsg, pParse
26160 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 0a 20 20 20  ->db, 0, 0, .   
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
26190 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
261a0 49 54 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20 20 69  IT_LENGTH]);.  i
261b0 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  f( pIdx->aColExp
261c0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
261d0 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 65 72  _str_appendf(&er
261e0 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27 25 71  rMsg, "index '%q
261f0 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  '", pIdx->zName)
26200 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
26210 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
26220 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
26230 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
26240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26250 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
26260 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f  >=0 );.      zCo
26270 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  l = pTab->aCol[p
26280 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
26290 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
262a0 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 5f 73  f( j ) sqlite3_s
262b0 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73  tr_append(&errMs
262c0 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20  g, ", ", 2);.   
262d0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
262e0 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67  ppendall(&errMsg
262f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
26300 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
26310 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d 73 67  r_append(&errMsg
26320 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ".", 1);.     
26330 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
26340 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67 2c 20  endall(&errMsg, 
26350 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zCol);.    }.  }
26360 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
26370 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
26380 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  &errMsg);.  sqli
26390 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
263a0 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49  t(pParse, .    I
263b0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
263c0 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f  (pIdx) ? SQLITE_
263d0 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
263e0 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20  RYKEY .         
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53     : SQLITE_CONS
26410 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20  TRAINT_UNIQUE,. 
26420 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72     onError, zErr
26430 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35  , P4_DYNAMIC, P5
26440 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
26450 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  e);.}.../*.** Co
26460 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
26470 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20  e to non-unique 
26480 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rowid..*/.void s
26490 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74  qlite3RowidConst
264a0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
264b0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
264c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
264d0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
264e0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
264f0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
26500 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65  rithm */.  Table
26510 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20   *pTab       /* 
26520 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74  The table with t
26530 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  he non-unique ro
26540 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61  wid */ .){.  cha
26550 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72  r *zMsg;.  int r
26560 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  c;.  if( pTab->i
26570 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a  PKey>=0 ){.    z
26580 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
26590 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
265a0 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
265b0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
265e0 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
265f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26600 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
26610 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b  ARYKEY;.  }else{
26620 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
26630 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
26640 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64  e->db, "%s.rowid
26650 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
26660 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26670 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
26680 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  D;.  }.  sqlite3
26690 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
266a0 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72  Parse, rc, onErr
266b0 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  or, zMsg, P4_DYN
266c0 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20  AMIC,.          
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35                P5
266e0 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75  _ConstraintUniqu
266f0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  e);.}../*.** Che
26700 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
26710 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
26720 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
26730 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
26740 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
26750 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
26760 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
26770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26780 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
26790 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
267a0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
267b0 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
267c0 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
267d0 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c  .  assert( zColl
267e0 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
267f0 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
26800 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
26810 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
26820 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
26830 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
26840 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69  =0 || pIndex->ai
26850 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20  Column[i]<0 );. 
26860 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
26870 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26  iColumn[i]>=0 &&
26880 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
26890 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  mp(z, zColl) ){.
268a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
268b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
268c0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
268d0 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
268e0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
268f0 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
26900 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
26910 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
26920 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
26930 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
26940 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
26950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26960 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
26970 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
26980 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
26990 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
269a0 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
269b0 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 21 49 73 56  oll){.  if( !IsV
269c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
269d0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
269e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
269f0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
26a00 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
26a10 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 70 49 6e   */..    for(pIn
26a20 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
26a30 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
26a40 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
26a50 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
26a60 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
26a70 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
26a80 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dex) ){.        
26a90 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
26aa0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
26ab0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
26ac0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
26ad0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
26ae0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
26af0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
26b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
26b10 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
26b20 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
26b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26b40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
26b50 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
26b60 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
26b70 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
26b80 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
26b90 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
26ba0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
26bb0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
26bc0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
26bd0 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
26be0 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
26bf0 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
26c00 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
26c10 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
26c20 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
26c30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
26c40 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
26c50 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
26c80 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
26c90 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
26ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
26cb0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
26cc0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
26cd0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26ce0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
26cf0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
26d00 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
26d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26d20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
26d30 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
26d40 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
26d50 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
26d60 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
26d70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
26d80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
26d90 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
26da0 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
26db0 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
26dc0 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
26dd0 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
26de0 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
26df0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
26e00 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
26e10 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
26e20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
26e30 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
26e40 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
26e50 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
26e60 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
26e70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
26e80 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
26e90 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
26ea0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
26eb0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
26ec0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
26ed0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
26ee0 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
26ef0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
26f00 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
26f30 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
26f40 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
26f60 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
26f70 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
26f80 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
26f90 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
26fa0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
26fb0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
26fc0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
26fd0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
26fe0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
26ff0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
27000 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
27010 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
27020 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
27030 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
27040 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
27050 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
27060 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
27070 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
27080 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
27090 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
270a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
270b0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
270c0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
270d0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
270e0 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
270f0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
27100 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
27110 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
27120 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
27130 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
27140 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
27150 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
27160 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
27170 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27190 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
271a0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
271b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
271c0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
271d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
271e0 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
271f0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
27200 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
27210 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
27220 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
27230 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
27240 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
27250 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27260 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
27270 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
27280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
27290 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
272a0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
272b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
272c0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
272d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
272e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
272f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
27300 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
27310 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
27320 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
27330 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
27340 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
27350 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27360 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
27370 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
27380 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
27390 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
273a0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
273b0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
273c0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
273d0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
273e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
273f0 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
27400 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
27410 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
27420 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
27430 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
27440 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
27450 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
27460 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
27470 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
27480 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
27490 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
274a0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
274b0 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
274c0 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
274d0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
274e0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
274f0 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
27500 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
27510 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
27520 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
27530 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
27540 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
27550 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
27560 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
27570 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
27580 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
27590 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
275a0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
275b0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
275c0 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
275d0 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
275e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
275f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
27600 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
27610 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
27620 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
27630 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
27640 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  bSName;.  pTab =
27650 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
27660 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
27670 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
27680 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
27690 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
276a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
276b0 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
276c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
276d0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
276e0 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
276f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
27700 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
27710 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
27720 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
27730 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
27740 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
27750 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
27760 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
27770 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
27780 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
27790 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
277a0 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
277b0 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
277c0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
277d0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
277e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49  ** Return a KeyI
277f0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
27800 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
27810 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
27820 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Index..**.** The
27830 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69   caller should i
27840 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79  nvoke sqlite3Key
27850 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74  InfoUnref() on t
27860 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
27870 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61  ct.** when it ha
27880 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67  s finished using
27890 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20   it..*/.KeyInfo 
278a0 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  *sqlite3KeyInfoO
278b0 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  fIndex(Parse *pP
278c0 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
278d0 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
278e0 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
278f0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
27900 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
27910 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
27920 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72  pKey;.  if( pPar
27930 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
27940 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  n 0;.  if( pIdx-
27950 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a  >uniqNotNull ){.
27960 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
27970 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
27980 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
27990 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d   nCol-nKey);.  }
279a0 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d  else{.    pKey =
279b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
279c0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
279d0 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20   nCol, 0);.  }. 
279e0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
279f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27a00 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
27a10 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  le(pKey) );.    
27a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
27a30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   i++){.      con
27a40 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
27a50 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
27a60 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
27a70 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d  oll[i] = zColl==
27a80 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
27a90 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20   ? 0 :.         
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
27ab0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
27ac0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
27ad0 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
27ae0 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20 3d 20  aSortFlags[i] = 
27af0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
27b00 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
27b10 74 28 20 30 3d 3d 28 70 4b 65 79 2d 3e 61 53 6f  t( 0==(pKey->aSo
27b20 72 74 46 6c 61 67 73 5b 69 5d 20 26 20 4b 45 59  rtFlags[i] & KEY
27b30 49 4e 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55  INFO_ORDER_BIGNU
27b40 4c 4c 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LL) );.    }.   
27b50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
27b60 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
27b70 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  t( pParse->rc==S
27b80 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53  QLITE_ERROR_MISS
27b90 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20  ING_COLLSEQ );. 
27ba0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
27bb0 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20  NoQuery==0 ){.  
27bc0 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76        /* Deactiv
27bd0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 62 65  ate the index be
27be0 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e  cause it contain
27bf0 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c  s an unknown col
27c00 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  lating.        *
27c10 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65  * sequence.  The
27c20 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61   only way to rea
27c30 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
27c40 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65  is to reload the
27c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65  .        ** sche
27c60 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20  ma.  Adding the 
27c70 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e  missing collatin
27c80 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72  g sequence later
27c90 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
27ca0 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68    ** reactive th
27cb0 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70  e index.  The ap
27cc0 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68  plication had th
27cd0 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69  e chance to regi
27ce0 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ster.        ** 
27cf0 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65  the missing inde
27d00 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  x using the coll
27d10 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
27d20 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20  lback.  For.    
27d30 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74      ** simplicit
27d40 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  y, SQLite will n
27d50 6f 74 20 67 69 76 65 20 74 68 65 20 61 70 70 6c  ot give the appl
27d60 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  ication a second
27d70 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20   chance..       
27d80 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78   */.        pIdx
27d90 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a  ->bNoQuery = 1;.
27da0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
27db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
27dc0 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d  R_RETRY;.      }
27dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
27de0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
27df0 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30  ;.      pKey = 0
27e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27e10 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69  turn pKey;.}..#i
27e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27e30 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  T_CTE./* .** Thi
27e40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
27e50 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54  oked once per CT
27e60 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  E by the parser 
27e70 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20  while parsing a 
27e80 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e  .** WITH clause.
27e90 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74   .*/.With *sqlit
27ea0 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72  e3WithAdd(.  Par
27eb0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
27ec0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
27ed0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74  context */.  Wit
27ee0 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
27ef0 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
27f00 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72   WITH clause, or
27f10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
27f20 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
27f30 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
27f40 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a  e common-table *
27f50 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
27f60 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f  rglist,     /* O
27f70 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e  ptional column n
27f80 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65  ame list for the
27f90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
27fa0 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20  ct *pQuery      
27fb0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65      /* Query use
27fc0 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
27fd0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
27fe0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
27ff0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69  pParse->db;.  Wi
28000 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72  th *pNew;.  char
28010 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43   *zName;..  /* C
28020 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54  heck that the CT
28030 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  E name is unique
28040 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54   within this WIT
28050 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a  H clause. If.  *
28060 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20  * not, store an 
28070 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
28080 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  se structure. */
28090 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
280a0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
280b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
280c0 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
280d0 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  && pWith ){.    
280e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
280f0 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
28100 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
28110 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
28120 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e  p(zName, pWith->
28130 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
28140 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28150 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28160 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54  , "duplicate WIT
28170 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73  H table name: %s
28180 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
28190 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
281a0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
281b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
281c0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
281d0 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
281e0 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
281f0 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
28200 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
28210 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
28220 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
28230 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
28240 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
28250 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
28260 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
28270 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
28280 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
28290 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
282a0 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
282b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
282c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
282d0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
282e0 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
282f0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
28300 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
28310 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
28320 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
28330 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
28340 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
28350 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
28360 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
28370 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
28380 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
28390 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
283a0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
283b0 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
283c0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
283d0 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
283e0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
283f0 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
28400 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
28410 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
28420 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
28430 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
28440 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
28450 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
28460 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
28470 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
28480 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
28490 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
284a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
284b0 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
284c0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
284d0 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
284e0 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
284f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28500 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28510 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
28520 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
28530 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
28540 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
28550 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
28560 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
28570 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
28580 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
28590 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
285a0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
285b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
285c0 20 2a 2f 0a                                       */.