/ Hex Artifact Content
Login

Artifact bd47530436bcdd6c6111a44c88d6c629ebc5a6666602d1cdb9b6b26a531ee741:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2e80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
2e90: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
2ea0: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20  base)<1 ){.     
2eb0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2ec0: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2ed0: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2ee0: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2ef0: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  d using.      **
2f00: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68   CREATE, then ch
2f10: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2f20: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2f30: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  an virtual table
2f40: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
2f50: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
2f60: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
2f70: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c  . */.      Modul
2f80: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2f90: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2fa0: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
2fb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
2fc0: 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71  f( pMod==0 && sq
2fd0: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2fe0: 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c  Name, "pragma_",
2ff0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   7)==0 ){.      
3000: 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65 33    pMod = sqlite3
3010: 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74  PragmaVtabRegist
3020: 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  er(db, zName);. 
3030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3040: 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74 65 33   pMod && sqlite3
3050: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
3060: 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  leInit(pParse, p
3070: 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Mod) ){.        
3080: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70  return pMod->pEp
3090: 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oTab;.      }.  
30a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
30b0: 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41  f( (flags & LOCA
30c0: 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a  TE_NOERR)==0 ){.
30d0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 61 73 65        if( zDbase
30e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3100: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3110: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
3130: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3140: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3150: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
3160: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
3170: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
3180: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
3190: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
31a0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
31b0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  ** Locate the ta
31c0: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
31d0: 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y *p..**.** This
31e0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
31f0: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61  ound sqlite3Loca
3200: 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64  teTable(). The d
3210: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
3220: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61  n.** sqlite3Loca
3230: 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68  teTable() and th
3240: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
3250: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
3260: 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74  n restricts.** t
3270: 68 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68  he search to sch
3280: 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29  ema (p->pSchema)
3290: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
32a0: 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d  LL. p->pSchema m
32b0: 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c  ay be.** non-NUL
32c0: 4c 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20  L if it is part 
32d0: 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69  of a view or tri
32e0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66  gger program def
32f0: 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20  inition. See.** 
3300: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
3310: 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  t() for details.
3320: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
3330: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
3340: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
3350: 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73  se, .  u32 flags
3360: 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ,.  struct SrcLi
3370: 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20  st_item *p.){.  
3380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
3390: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
33a0: 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  chema==0 || p->z
33b0: 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20  Database==0 );. 
33c0: 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20   if( p->pSchema 
33d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
33e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
33f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
3400: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
3410: 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d     zDb = pParse-
3420: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
3430: 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  bSName;.  }else{
3440: 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44  .    zDb = p->zD
3450: 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72  atabase;.  }.  r
3460: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63  eturn sqlite3Loc
3470: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
3480: 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65   flags, p->zName
3490: 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , zDb);.}../*.**
34a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
34b0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
34c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
34d0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
34e0: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
34f0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
3500: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
3510: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3520: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
3530: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
3540: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
3550: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
3560: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
3570: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
3580: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
3590: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
35a0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
35b0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
35c0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
35d0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
35e0: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
35f0: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
3600: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
3610: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
3620: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
3630: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
3640: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
3650: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
3660: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
3670: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
3680: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
3690: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
36a0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
36b0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
36c0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
36d0: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ;.  /* All mutex
36e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
36f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
3700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
3710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
3720: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
3730: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
3740: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
3750: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
3760: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
3770: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3780: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
3790: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
37a0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
37b0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
37c0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
37d0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
37e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
37f0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
3800: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
3810: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
3820: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
3830: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3850: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3860: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3870: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3880: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3890: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
38a0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
38b0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
38c0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
38d0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
38e0: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
38f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
3900: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
3910: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
3920: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3930: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
3940: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
3950: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3960: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3970: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3980: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
39a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
39b0: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
39c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
39d0: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
39e0: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
39f0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
3a00: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
3a10: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
3a20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3a30: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
3a40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
3a50: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
3a60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3a70: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3a80: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3a90: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3aa0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3ab0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3ac0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3ad0: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3ae0: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3af0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
3b00: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
3b10: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
3b20: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
3b30: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3b40: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
3b50: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
3b60: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3b70: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3b80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3ba0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3bb0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3bc0: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3bd0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3be0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3bf0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3c00: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3c10: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3c20: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3c30: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3c40: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3c50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3c60: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3c70: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3c80: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3c90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3ca0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3cb0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3cc0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3cd0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3ce0: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3cf0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3d00: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3d10: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3d20: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3d30: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3d40: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3d50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3d60: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3d70: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3d80: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3d90: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3da0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3db0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3dc0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3dd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3de0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3df0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3e00: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
3e10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
3e20: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
3e30: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
3e40: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  ge;.}../*.** Loo
3e50: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69  k through the li
3e60: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62  st of open datab
3e70: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d  ase files in db-
3e80: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a  >aDb[] and if.**
3e90: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63   any have been c
3ea0: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68  losed, remove th
3eb0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  em from the list
3ec0: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Reallocate th
3ed0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73  e.** db->aDb[] s
3ee0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d  tructure to a sm
3ef0: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70  aller size, if p
3f00: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45  ossible..**.** E
3f10: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69  ntry 0 (the "mai
3f20: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64  n" database) and
3f30: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74   entry 1 (the "t
3f40: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a  emp" database).*
3f50: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64  * are never cand
3f60: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67  idates for being
3f70: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76   collapsed..*/.v
3f80: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  oid sqlite3Colla
3f90: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
3fa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3fb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
3fc0: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
3fd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
3fe0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
3ff0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4000: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
4010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4020: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a  bFree(db, pDb->z
4030: 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  DbSName);.      
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20  pDb->zDbSName = 
4050: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
4060: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
4070: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
4080: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
4090: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
40a0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
40b0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
40c0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
40d0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
40e0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
40f0: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
4100: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
4110: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
4120: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4130: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
4140: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
4150: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
4160: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4170: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4180: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4190: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
41a0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
41b0: 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20  MP schema.  The 
41c0: 72 65 73 65 74 20 69 73 20 64 65 66 65 72 72 65  reset is deferre
41d0: 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61  d if db->nSchema
41e0: 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f  Lock is not zero
41f0: 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65  ..** Deferred re
4200: 73 65 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20  sets may be run 
4210: 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20  by calling with 
4220: 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  iDb<0..*/.void s
4230: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
4240: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
4250: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
4260: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t i;.  assert( i
4270: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
4280: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
4290: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
42a0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
42b0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
42c0: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
42d0: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52  ty(db, iDb, DB_R
42e0: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
42f0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
4300: 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61  b, 1, DB_ResetWa
4310: 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  nted);.    db->m
4320: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4330: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4340: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
4350: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4360: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4370: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
4380: 0a 20 20 20 20 20 20 69 66 28 20 44 62 48 61 73  .      if( DbHas
4390: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
43a0: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20  DB_ResetWanted) 
43b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
43c0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
43d0: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
43e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
43f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
4400: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
4410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
4420: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
4430: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  abases (includin
4440: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20  g.** "main" and 
4450: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69  "temp") for a si
4460: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
4470: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4480: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c  d sqlite3ResetAl
4490: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
44a0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
44b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
44c0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
44d0: 6c 6c 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ll(db);.  assert
44e0: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
44f0: 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k==0 );.  for(i=
4500: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4510: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
4520: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4530: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
4540: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
4550: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
4560: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
4570: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d     }.  }.  db->m
4580: 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46  DbFlags &= ~(DBF
4590: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
45a0: 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e  |DBFLAG_SchemaKn
45b0: 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65  ownOk);.  sqlite
45c0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
45d0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
45e0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
45f0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  .  sqlite3Collap
4600: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
4610: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  db);.}../*.** Th
4620: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4630: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
4640: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
4650: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
4660: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
4670: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4680: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20  db->mDbFlags &= 
4690: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  ~DBFLAG_SchemaCh
46a0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ange;.}../*.** D
46b0: 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  elete memory all
46c0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 63  ocated for the c
46d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61  olumn names of a
46e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28   table or view (
46f0: 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f  the.** Table.aCo
4700: 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76  l[] array)..*/.v
4710: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
4720: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c  eColumnNames(sql
4730: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4740: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
4750: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
4760: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
4770: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
4780: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
4790: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
47a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
47b0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
47c0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
47d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
47e0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
47f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4800: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
4810: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
4820: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4830: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
4840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
4850: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4860: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
4870: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
4880: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
4890: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
48a0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
48b0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
48c0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
48d0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
48e0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
48f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
4900: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
4910: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
4920: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
4930: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
4940: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
4950: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4960: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
4970: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
4980: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
4990: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
49a0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
49b0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
49c0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
49d0: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65   The db paramete
49e0: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  r is optional.  
49f0: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  It is needed if 
4a00: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4a10: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f   .** contains lo
4a20: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20  okaside memory. 
4a30: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20   (Table objects 
4a40: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f  in the schema do
4a50: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b   not use.** look
4a60: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75  aside memory, bu
4a70: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c  t some ephemeral
4a80: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64   Table objects d
4a90: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64  o.)  Or the.** d
4aa0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20  b parameter can 
4ab0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d  be used with db-
4ac0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f  >pnBytesFreed to
4ad0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d   measure the mem
4ae0: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  ory.** used by t
4af0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e  he Table object.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b10: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
4b20: 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  deleteTable(sqli
4b30: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
4b40: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
4b50: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
4b60: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4b70: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f  _DEBUG.  /* Reco
4b80: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4b90: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4ba0: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4bb0: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4bc0: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4bd0: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4be0: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4bf0: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4c00: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4c10: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4c20: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4c30: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4c40: 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  .  int nLookasid
4c50: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20  e = 0;.  if( db 
4c60: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
4c70: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4c80: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
4c90: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
4ca0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
4cb0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
4cc0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
4cd0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4ce0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4cf0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4d00: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4d10: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4d20: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4d30: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4d40: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4d50: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4d60: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4d70: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4d80: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4d90: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4da0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4db0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
4dc0: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
4dd0: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
4de0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4df0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
4e00: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
4e10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
4e20: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
4e30: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
4e40: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
4e50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
4e60: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
4e70: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
4e80: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
4e90: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
4ea0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
4eb0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
4ec0: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
4ed0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
4ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
4ef0: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
4f00: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
4f10: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
4f20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4f30: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4f40: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4f50: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4f60: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4f70: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4f80: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4f90: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4fa0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4fb0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4fc0: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
4fd0: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
4fe0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4ff0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5000: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5010: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5020: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5030: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5040: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5050: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
5060: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5070: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
5080: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
5090: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
50a0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
50b0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
50c0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
50d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
50e0: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
50f0: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5100: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5110: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5120: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5130: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5140: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5150: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
5160: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
5170: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
5180: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5190: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
51a0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
51b0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
51c0: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
51d0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
51e0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
51f0: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5200: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5210: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5220: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5230: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5240: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5250: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
5260: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
5270: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
5280: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
5290: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
52a0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
52b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
52c0: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
52d0: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
52e0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
52f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5300: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5310: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5320: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5330: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5340: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5350: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
5360: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
5370: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
5380: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
5390: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
53a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
53b0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
53c0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
53d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
53e0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
53f0: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5400: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5410: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5420: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5430: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5440: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5450: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
5460: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
5470: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5480: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
5490: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
54a0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
54b0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5ac0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5ad0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5ae0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5af0: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5b00: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5b10: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5b20: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5b30: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5b40: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5b50: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5b60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5b70: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5b80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5b90: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5ba0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5bb0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5bd0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5be0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5bf0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5c00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5c10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5c20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5c50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5c70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5c80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5c90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ca0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5cb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5cc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5ce0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5cf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5d20: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5d30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5d60: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5d80: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5d90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5da0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5db0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5dd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5de0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5df0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5e00: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5e40: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5e60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5e70: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5e80: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5e90: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5ea0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5eb0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5ec0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5ed0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5ee0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5ef0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5f00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5f10: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5f20: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f30: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5f40: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5f50: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5f60: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f80: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5fa0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5fb0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5fc0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5fd0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5fe0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5ff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6000: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6020: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6030: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6040: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6050: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6060: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6070: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6080: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
6090: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
60a0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
60b0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
60c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
60d0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
60e0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
60f0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6100: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6110: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6120: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6130: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6140: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6160: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
6170: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
6180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
61a0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
61b0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
61c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
61d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
61e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
61f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6210: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6220: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6230: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6240: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6250: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
6260: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
6270: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
6280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6290: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
62a0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
62b0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
62c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
62d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
62e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
62f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6300: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6310: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6320: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6330: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6340: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6350: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6360: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
6370: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
6380: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
6390: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
63a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
63b0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
63c0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
63d0: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
63e0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
63f0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
6400: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
6410: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
6420: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
6430: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6440: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6450: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6460: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
6470: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
6480: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
6490: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
64a0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
64b0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
64c0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
64d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
64e0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
64f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
6500: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
6510: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
6520: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
6530: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6540: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6550: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6560: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
6570: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
6580: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6590: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
65a0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
65b0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
65c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
65d0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
65e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
65f0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
6600: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
6610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6620: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6630: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6640: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6650: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6660: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
6670: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
6680: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
6690: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
66a0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
66b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
66c0: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
66d0: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
66e0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6700: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
6710: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
6720: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
6730: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6740: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6750: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6760: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
6770: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
6780: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6790: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
67a0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
67b0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
67c0: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
67d0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
67e0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
67f0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
6800: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
6810: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
6820: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
6830: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6840: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6850: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6860: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
6870: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
6880: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6890: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
68a0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
68b0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
68c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
68d0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
68e0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
68f0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
6900: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
6910: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
6920: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
6930: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6940: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6950: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6960: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
6970: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6990: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
69a0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
69b0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
69c0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
69d0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
69e0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
69f0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
6a00: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
6a10: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
6a20: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
6a30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6a40: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6a50: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6a60: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6a70: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6a80: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6a90: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6aa0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6ab0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6ac0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6ad0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
6ae0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6af0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
6b00: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
6b10: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
6b20: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
6b30: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6b40: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6b50: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6b60: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6b70: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6b80: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6b90: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6ba0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6bb0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6bc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6bd0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6be0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6bf0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
6c00: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
6c10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
6c20: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
6c30: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6c40: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6c50: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6c60: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6c70: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6c80: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6c90: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6ca0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6cb0: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6cc0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6cd0: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
6ce0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
6cf0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6d00: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
6d10: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
6d20: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
6d30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6d40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6d50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6d60: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6d70: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6d80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6d90: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6da0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6db0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6dc0: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6dd0: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6de0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6df0: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  /..  if( db->ini
6e00: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e  t.busy && db->in
6e10: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b  it.newTnum==1 ){
6e20: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
6e30: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74  case:  Parsing t
6e40: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6e50: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   or sqlite_temp_
6e60: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f  master schema */
6e70: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
6e80: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61  nit.iDb;.    zNa
6e90: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
6ea0: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f  rDup(db, SCHEMA_
6eb0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20  TABLE(iDb));.   
6ec0: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b   pName = pName1;
6ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6ee0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
6ef0: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
6f00: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6f10: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
6f20: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
6f30: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
6f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6f50: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6f60: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
6f70: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
6f80: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
6f90: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
6fa0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
6fb0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
6fc0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
6fd0: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
6fe0: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
6ff0: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
7000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7010: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7020: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
7030: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
7040: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  alified");.     
7050: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7060: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
7070: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
7080: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61  iDb = 1;.    zNa
7090: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
70a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
70b0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e  ame);.    if( IN
70c0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
70d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
70e0: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
70f0: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61  arse, (void*)zNa
7100: 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  me, pName);.    
7110: 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
7120: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
7130: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
7140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7150: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7160: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
7170: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7180: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7190: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
71a0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
71b0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
71c0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
71d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
71e0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
71f0: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7200: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7210: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
7220: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
7230: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
7240: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
7250: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
7260: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7270: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7280: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7290: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
72a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
72b0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
72c0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
72d0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
72e0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
72f0: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7300: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7310: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7320: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7330: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7340: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7350: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7360: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7370: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7380: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7390: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
73a0: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
73b0: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
73f0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7400: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7410: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
7420: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
7430: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
7440: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
7450: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
7460: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
7470: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
7480: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
7490: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
74a0: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
74b0: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
74c0: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
74d0: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
74e0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
74f0: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
7500: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
7510: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
7520: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
7530: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
7540: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
7550: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
7560: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
7570: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
7580: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
7590: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
75a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
75b0: 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
75c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
75d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
75e0: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
75f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7600: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
7610: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
7620: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7630: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7640: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7650: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
7660: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
7670: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
7680: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
7690: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
76a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
76b0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
76c0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
76d0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
76e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
76f0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7700: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
7710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7720: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
7730: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
7740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
7750: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7760: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
7770: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
7780: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
7790: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
77a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
77b0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
77c0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
77d0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
77e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
77f0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7800: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
7810: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7820: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7830: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
7840: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7850: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7860: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7870: 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed );.    pParse
7880: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
7890: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50  MEM_BKPT;.    pP
78a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
78b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
78c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
78d0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
78e0: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
78f0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
7900: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
7910: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
7920: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
7930: 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69  >nTabRef = 1;.#i
7940: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
7950: 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61  ULT_ROWEST.  pTa
7960: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  ble->nRowLogEst 
7970: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
7980: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
7990: 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20  OWEST);.#else.  
79a0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
79b0: 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
79c0: 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
79d0: 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
79e0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
79f0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
7a00: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ble==0 );.  pPar
7a10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
7a20: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
7a30: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
7a40: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
7a50: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
7a60: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
7a70: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
7a80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7a90: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
7aa0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
7ab0: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
7ac0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
7ad0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
7ae0: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
7af0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7b00: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
7b10: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
7b20: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
7b30: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
7b40: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
7b50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7b60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
7b70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
7b80: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
7b90: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
7ba0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
7bb0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
7bc0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
7bd0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
7be0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
7bf0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
7c00: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
7c10: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
7c20: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
7c30: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
7c40: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
7c50: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
7c60: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7c70: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
7c80: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
7c90: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
7ca0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
7cb0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
7cc0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
7cd0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
7ce0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
7cf0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
7d00: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
7d10: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
7d20: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
7d30: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
7d40: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
7d50: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
7d60: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
7d70: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
7d80: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
7d90: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7da0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
7db0: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20   int addr1;.    
7dc0: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
7dd0: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
7de0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a  g2, reg3;.    /*
7df0: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e   nullRow[] is an
7e00: 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64   OP_Record encod
7e10: 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e  ing of a row con
7e20: 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20  taining 5 NULLs 
7e30: 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
7e40: 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77  nst char nullRow
7e50: 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20  [] = { 6, 0, 0, 
7e60: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73  0, 0, 0 };.    s
7e70: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
7e80: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7e90: 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
7ea0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7eb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7ec0: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
7ed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7ee0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7ef0: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
7f00: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
7f10: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
7f20: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
7f30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7f40: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
7f50: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
7f60: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
7f70: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
7f80: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
7f90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7fa0: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
7fb0: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
7fc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7fd0: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
7fe0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
7ff0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8000: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
8010: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c   reg3, BTREE_FIL
8020: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
8030: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
8040: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
8050: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
8060: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
8070: 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65  _If, reg3); Vdbe
8080: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
8090: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
80a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
80b0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
80c0: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
80d0: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
80e0: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
80f0: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
8100: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8110: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
8120: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
8130: 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a  T, fileFormat);.
8140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8150: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8160: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8170: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
8180: 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73   ENC(db));.    s
8190: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
81a0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
81b0: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
81c0: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
81d0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
81e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
81f0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
8200: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
8210: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
8220: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
8230: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
8240: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
8250: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
8260: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
8270: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
8280: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
8290: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
82a0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
82b0: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  ry is left in re
82c0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
82d0: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20  egRowid..    ** 
82e0: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
82f0: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
8300: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e  table is left in
8310: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67   reg pParse->reg
8320: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  Root..    ** The
8330: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20   rowid and root 
8340: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
8350: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  es are needed by
8360: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20   the code that. 
8370: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64     ** sqlite3End
8380: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72  Table will gener
8390: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
83a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
83b0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
83c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
83d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
83e0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
83f0: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
8400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8410: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8420: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
8430: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8440: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50  f.    {.      pP
8450: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
8460: 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  =.         sqlit
8470: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8480: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20  OP_CreateBtree, 
8490: 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45 45  iDb, reg2, BTREE
84a0: 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d 0a  _INTKEY);.    }.
84b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
84c0: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
84d0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
84e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
84f0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
8500: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8520: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65  , OP_Blob, 6, re
8530: 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20  g3, 0, nullRow, 
8540: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
8550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8560: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8570: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
8580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8590: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
85a0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
85b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
85c0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
85d0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
85e0: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
85f0: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
8600: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
8610: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
8620: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
8630: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
8640: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8650: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
8660: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72  rn;.}../* Set pr
8670: 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61  operties of a ta
8680: 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64  ble column based
8690: 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c   on the (magical
86a0: 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  ).** name of the
86b0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20   column..*/.#if 
86c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49  SQLITE_ENABLE_HI
86d0: 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69  DDEN_COLUMNS.voi
86e0: 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50  d sqlite3ColumnP
86f0: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
8700: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43  e(Table *pTab, C
8710: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
8720: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
8730: 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  icmp(pCol->zName
8740: 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20  , "__hidden__", 
8750: 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  10)==0 ){.    pC
8760: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
8770: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a  COLFLAG_HIDDEN;.
8780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
8790: 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e   && pCol!=pTab->
87a0: 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31  aCol && (pCol[-1
87b0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
87c0: 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a  FLAG_HIDDEN) ){.
87d0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
87e0: 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64  gs |= TF_OOOHidd
87f0: 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  en;.  }.}.#endif
8800: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
8810: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  ew column to the
8820: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8830: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8840: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
8850: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
8860: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72  routine once for
8870: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63   each column dec
8880: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  laration.** in a
8890: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
88a0: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65  atement.  sqlite
88b0: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  3StartTable() ge
88c0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
88d0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
88e0: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
88f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8900: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
8910: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
8920: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
8930: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8940: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54   Token *pName, T
8950: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8960: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
8970: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8980: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43  char *zType;.  C
8990: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
89a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
89b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
89c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
89d0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
89e0: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  rn;.  if( p->nCo
89f0: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
8a00: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
8a10: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
8a20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8a30: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
8a40: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
8a50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
8a60: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  rn;.  }.  z = sq
8a70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8a80: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20  (db, pName->n + 
8a90: 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20  pType->n + 2);. 
8aa0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
8ab0: 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  rn;.  if( IN_REN
8ac0: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c  AME_OBJECT ) sql
8ad0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
8ae0: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
8af0: 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 6d  *)z, pName);.  m
8b00: 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e  emcpy(z, pName->
8b10: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
8b20: 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b  z[pName->n] = 0;
8b30: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
8b40: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
8b50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
8b60: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
8b70: 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e  3_stricmp(z, p->
8b80: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
8b90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8ba0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8bb0: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
8bc0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
8bd0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
8be0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8c00: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
8c10: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
8c20: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
8c30: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
8c40: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
8c50: 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d  c(db,p->aCol,(p-
8c60: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
8c70: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
8c80: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
8c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8ca0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8cb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8cc0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
8cd0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
8ce0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
8cf0: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
8d00: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
8d10: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
8d20: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
8d30: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
8d40: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
8d50: 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69  (p, pCol);. .  i
8d60: 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29  f( pType->n==0 )
8d70: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
8d80: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
8d90: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
8da0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
8db0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a   affinity.    **
8dc0: 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61 20 64   'BLOB' with a d
8dd0: 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 34  efault size of 4
8de0: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 70   bytes. */.    p
8df0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8e00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
8e10: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  .    pCol->szEst
8e20: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
8e30: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8e40: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8e50: 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65 33 47   if( 4>=sqlite3G
8e60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f  lobalConfig.szSo
8e70: 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20  rterRef ){.     
8e80: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8e90: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45  |= COLFLAG_SORTE
8ea0: 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RREF;.    }.#end
8eb0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8ec0: 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69  zType = z + sqli
8ed0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
8ee0: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   1;.    memcpy(z
8ef0: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8f00: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a  pType->n);.    z
8f10: 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d  Type[pType->n] =
8f20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
8f30: 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20  equote(zType);. 
8f40: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8f50: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
8f60: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 70  ityType(zType, p
8f70: 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Col);.    pCol->
8f80: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8f90: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d  LAG_HASTYPE;.  }
8fa0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20  .  p->nCol++;.  
8fb0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
8fc0: 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a  ntName.n = 0;.}.
8fd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8fe0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8ff0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9000: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9010: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9020: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9030: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
9040: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
9050: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
9060: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
9070: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
9080: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
9090: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
90a0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
90b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
90c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
90d0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
90e0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
90f0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
9100: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
9110: 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  Col;.  p = pPars
9120: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9130: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
9140: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
9150: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
9160: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
9170: 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74  -1];.  pCol->not
9180: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
9190: 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67  or;.  p->tabFlag
91a0: 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75  s |= TF_HasNotNu
91b0: 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ll;..  /* Set th
91c0: 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c  e uniqNotNull fl
91d0: 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45  ag on any UNIQUE
91e0: 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61   or PK indexes a
91f0: 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20  lready created. 
9200: 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75   ** on this colu
9210: 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  mn.  */.  if( pC
9220: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
9230: 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b  OLFLAG_UNIQUE ){
9240: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9250: 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
9260: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9270: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9280: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9290: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
92a0: 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  1 && pIdx->onErr
92b0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
92c0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
92d0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e  iColumn[0]==p->n
92e0: 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Col-1 ){.       
92f0: 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
9300: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ll = 1;.      }.
9310: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9320: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
9330: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
9340: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
9350: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
9360: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
9370: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
9380: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9390: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
93a0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
93b0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
93c0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
93d0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
93e0: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
93f0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
9400: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
9410: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
9420: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
9430: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
9440: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
9450: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
9460: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
9470: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
9480: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
9490: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
94a0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
94b0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
94c0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
94d0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
94e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
94f0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
9500: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9530: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
9540: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9550: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
9560: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9570: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
9580: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9590: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
95a0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
95b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
95c0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
95d0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a  SQLITE_AFF_BLOB.
95e0: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
95f0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
9600: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
9610: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9620: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
9630: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9640: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
9650: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
9660: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
9670: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
9680: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
9690: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
96a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
96b0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
96c0: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
96d0: 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a 70   *zIn, Column *p
96e0: 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Col){.  u32 h = 
96f0: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
9700: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9710: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
9720: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
9730: 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29  assert( zIn!=0 )
9740: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
9750: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
9760: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
9770: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
9780: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
9790: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
97a0: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
97b0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
97c0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
97d0: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
97e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
97f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
9800: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
9810: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
9820: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9830: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
9840: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
9850: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9860: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9870: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9880: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
9890: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
98a0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
98b0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
98c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
98d0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
98e0: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
98f0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9900: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9910: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
9920: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
9930: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9940: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
9950: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
9960: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9970: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
9980: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
9990: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
99a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
99b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
99c0: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
99d0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
99e0: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
99f0: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
9a00: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
9a10: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
9a20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9a30: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9a40: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
9a50: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9a60: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
9a70: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
9a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
9a90: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
9aa0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9ab0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9ac0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9ad0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9ae0: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
9af0: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
9b00: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
9b10: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
9b20: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
9b30: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9b40: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
9b50: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9b60: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
9b70: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
9b80: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
9b90: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
9ba0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9bb0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9bc0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9be0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9bf0: 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c   pCol is not NUL
9c00: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
9c10: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
9c20: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
9c30: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
9c40: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
9c50: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
9c60: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
9c70: 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
9c80: 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f 2a 20  int v = 0;   /* 
9c90: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20  default size is 
9ca0: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a  approx 4 bytes *
9cb0: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51  /.    if( aff<SQ
9cc0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
9ce0: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77  har ){.        w
9cf0: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29  hile( zChar[0] )
9d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9d10: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
9d20: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Char[0]) ){.    
9d30: 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 28          /* BLOB(
9d40: 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20  k), VARCHAR(k), 
9d50: 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f  CHAR(k) -> r=(k/
9d60: 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  4+1) */.        
9d70: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e      sqlite3GetIn
9d80: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a  t32(zChar, &v);.
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9da0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9db0: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9dc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9de0: 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20 42 4c   v = 16;   /* BL
9df0: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d  OB, TEXT, CLOB -
9e00: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32  > r=5  (approx 2
9e10: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20  0 bytes)*/.     
9e20: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
9e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
9e40: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
9e50: 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c 69 74      if( v>=sqlit
9e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9e70: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9e80: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9e90: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9ea0: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9eb0: 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20 76 2f  endif.    v = v/
9ec0: 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 76  4 + 1;.    if( v
9ed0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a  >255 ) v = 255;.
9ee0: 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20      pCol->szEst 
9ef0: 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
9f00: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
9f10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9f20: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
9f30: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
9f40: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9f50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
9f60: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
9f70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9f80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
9f90: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
9fa0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
9fb0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
9fc0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
9fd0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
9fe0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
9ff0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a000: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
a010: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
a020: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
a030: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
a040: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
a050: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a060: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20 20  DefaultValue(.  
a070: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a090: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a0a0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a0c0: 20 70 61 72 73 65 64 20 65 78 70 72 65 73 73 69   parsed expressi
a0d0: 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  on of the defaul
a0e0: 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e  t value */.  con
a0f0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
a100: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
a110: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  f the default va
a120: 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f  lue text */.  co
a130: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
a140: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a150: 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20 65  character past e
a160: 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76 61 6c  nd of defaut val
a170: 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  ue text */.){.  
a180: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
a190: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
a1a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a1b0: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72  ->db;.  p = pPar
a1c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a1d0: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
a1e0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
a1f0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
a200: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
a210: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
a220: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20 64  unction(pExpr, d
a230: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
a240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a260: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
a270: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
a280: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
a290: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
a2a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
a2b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  {.      /* A cop
a2c0: 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73  y of pExpr is us
a2d0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
a2e0: 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70  e original, as p
a2f0: 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20  Expr contains.  
a300: 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68      ** tokens th
a310: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61  at point to vola
a320: 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20  tile memory..   
a330: 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
a340: 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   x;.      sqlite
a350: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a360: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
a370: 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30      memset(&x, 0
a380: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
a390: 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50      x.op = TK_SP
a3a0: 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54  AN;.      x.u.zT
a3b0: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  oken = sqlite3Db
a3c0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
a3d0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20  rt, zEnd);.     
a3e0: 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72   x.pLeft = pExpr
a3f0: 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20  ;.      x.flags 
a400: 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  = EP_Skip;.     
a410: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
a420: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a430: 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45  , &x, EXPRDUP_RE
a440: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
a450: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78  ite3DbFree(db, x
a460: 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  .u.zToken);.    
a470: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 52  }.  }.  if( IN_R
a480: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
a490: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
a4a0: 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72 73  eExprUnmap(pPars
a4b0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  e, pExpr);.  }. 
a4c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a4d0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
a4e0: 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64  ../*.** Backward
a4f0: 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s Compatibility 
a500: 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73  Hack:.** .** His
a510: 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73  torical versions
a520: 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70   of SQLite accep
a530: 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63  ted strings as c
a540: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a  olumn names in.*
a550: 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52  * indexes and PR
a560: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
a570: 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49  aints and in UNI
a580: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
a590: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
a5a0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a5b0: 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c  E xyz(a,b,c,d,e,
a5c0: 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29  PRIMARY KEY('a')
a5d0: 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20  ,UNIQUE('b','c' 
a5e0: 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a  COLLATE trim).**
a5f0: 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45       CREATE INDE
a600: 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27  X abc ON xyz('c'
a610: 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f  ,'d' DESC,'e' CO
a620: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53  LLATE nocase DES
a630: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  C);.**.** This i
a640: 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f  s goofy.  But to
a650: 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61   preserve backwa
a660: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
a670: 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f  y we continue to
a680: 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20  .** accept it.  
a690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
a6a0: 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
a6b0: 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20  conversion.  It 
a6c0: 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20  converts.** the 
a6d0: 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e  expression given
a6e0: 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74   in its argument
a6f0: 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e   from a TK_STRIN
a700: 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a  G into a TK_ID.*
a710: 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
a720: 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b  ion is just a TK
a730: 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20  _STRING with an 
a740: 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45  optional COLLATE
a750: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74   clause..** If t
a760: 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73  he epxression is
a770: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
a780: 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20  than TK_STRING, 
a790: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a7a0: 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a  s.** unchanged..
a7b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a7c0: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
a7d0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
a7e0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
a7f0: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  G ){.    p->op =
a800: 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20   TK_ID;.  }else 
a810: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
a820: 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66  LLATE && p->pLef
a830: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  t->op==TK_STRING
a840: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74   ){.    p->pLeft
a850: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
a860: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  }.}../*.** Desig
a870: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
a880: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
a890: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
a8a0: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
a8b0: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
a8c0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
a8d0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
a8e0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
a8f0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
a900: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
a910: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
a920: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
a930: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
a940: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
a950: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
a960: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
a970: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
a980: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
a990: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
a9a0: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
a9b0: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
a9c0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
a9d0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
a9e0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
a9f0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
aa00: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
aa10: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
aa20: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
aa30: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
aa40: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
aa50: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
aa60: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
aa70: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
aa80: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
aa90: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
aaa0: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
aab0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
aac0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
aad0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
aae0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
aaf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
ab00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
ab10: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
ab20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
ab30: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
ab40: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
ab50: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
ab60: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
ab70: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
ab80: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
ab90: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
aba0: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
abb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
abc0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
abd0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
abe0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
abf0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
ac00: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
ac10: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
ac20: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
ac30: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
ac40: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
ac50: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
ac60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
ac70: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
ac80: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
ac90: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
aca0: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
acb0: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
acc0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
acd0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
ace0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
acf0: 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ble;.  Column *p
ad00: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
ad10: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
ad20: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
ad30: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
ad40: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
ad50: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
ad60: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
ad70: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
ad80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ad90: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
ada0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
adb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
adc0: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
add0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
ade0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
adf0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
ae00: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
ae10: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
ae20: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ae30: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
ae40: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
ae50: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
ae60: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70  Col[iCol];.    p
ae70: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
ae80: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
ae90: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
aea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
aeb0: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
aec0: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
aed0: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
aee0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
aef0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
af00: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
af10: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
af20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
af30: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
af40: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
af50: 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20  Id(pCExpr);.    
af60: 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
af70: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
af80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
af90: 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e  CName = pCExpr->
afa0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
afb0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
afc0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
afd0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
afe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
aff0: 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61  ICmp(zCName, pTa
b000: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
b010: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
b020: 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
b030: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
b040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
b050: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
b060: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
b070: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b080: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
b090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b0b0: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
b0c0: 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74  pCol.   && sqlit
b0d0: 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65  e3StrICmp(sqlite
b0e0: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
b0f0: 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29  ,""), "INTEGER")
b100: 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72  ==0.   && sortOr
b110: 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  der!=SQLITE_SO_D
b120: 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ESC.  ){.    if(
b130: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
b140: 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  T && pList ){.  
b150: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
b160: 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
b170: 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65 79  se, &pTab->iPKey
b180: 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  , pList->a[0].pE
b190: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
b1a0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
b1b0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
b1c0: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
b1d0: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
b1e0: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
b1f0: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
b200: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
b210: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
b220: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20  toincrement;.   
b230: 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61   if( pList ) pPa
b240: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
b250: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  r = pList->a[0].
b260: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c  sortOrder;.  }el
b270: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
b280: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
b290: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
b2a0: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
b2b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b2c0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
b2d0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
b2e0: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
b2f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b300: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
b310: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b320: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
b330: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
b340: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
b350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b360: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
b370: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c  ortOrder, 0, SQL
b380: 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
b390: 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69  ARYKEY);.    pLi
b3a0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
b3b0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
b3c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b3d0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
b3e0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
b3f0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
b400: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
b410: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
b420: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
b430: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b440: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
b450: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
b460: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
b470: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
b480: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
b490: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
b4a0: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
b4b0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
b4c0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b4d0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
b4e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
b4f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
b500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b510: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
b520: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
b530: 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26  CLARE_VTAB.   &&
b540: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
b550: 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62  Readonly(db->aDb
b560: 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70  [db->init.iDb].p
b570: 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  Bt).  ){.    pTa
b580: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
b590: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b5a0: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
b5b0: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
b5c0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
b5d0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
b5e0: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
b5f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
b600: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
b610: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
b620: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
b630: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
b640: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
b650: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
b660: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
b670: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
b680: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
b690: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
b6a0: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
b6b0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
b6c0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
b6d0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
b6e0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
b6f0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
b700: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
b710: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
b720: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
b730: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
b740: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
b750: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
b760: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
b770: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b780: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b790: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
b7a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
b7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b7c0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
b7d0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
b7e0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
b7f0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
b800: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
b810: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
b820: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
b830: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
b840: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
b850: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
b860: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
b870: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
b880: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
b890: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b8a0: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
b8b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
b8c0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
b8d0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
b8e0: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
b8f0: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
b900: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
b910: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
b920: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
b930: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
b940: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
b950: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
b960: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
b970: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
b980: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
b990: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
b9a0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b9b0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
b9c0: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
b9d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
b9e0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b9f0: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
ba00: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
ba10: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
ba20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
ba30: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ba40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ba50: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
ba60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ba70: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
ba80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ba90: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
baa0: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
bab0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
bac0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
bad0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
bae0: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
baf0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
bb00: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
bb10: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
bb20: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
bb30: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
bb40: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
bb50: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
bb60: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
bb70: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
bb80: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
bb90: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bba0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
bbb0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
bbc0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
bbd0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
bbe0: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
bbf0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
bc00: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
bc10: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
bc20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
bc30: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
bc40: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
bc50: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
bc60: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
bc70: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
bc80: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
bc90: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
bca0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
bcb0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
bcc0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
bcd0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
bce0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
bcf0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
bd00: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
bd10: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
bd20: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
bd30: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
bd40: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
bd50: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
bd60: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
bd70: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
bd80: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
bd90: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
bda0: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
bdb0: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
bdc0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
bdd0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
bde0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
bdf0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
be00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
be10: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
be20: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
be30: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
be40: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
be50: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
be60: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
be70: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
be80: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
be90: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
bea0: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
beb0: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
bec0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
bed0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
bee0: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
bef0: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
bf00: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
bf10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
bf20: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
bf30: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
bf40: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
bf50: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
bf60: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
bf70: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
bf80: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
bf90: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
bfa0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
bfb0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
bfc0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
bfd0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
bfe0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
bff0: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
c000: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
c010: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
c020: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
c030: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
c040: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
c050: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
c060: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
c070: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c080: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
c090: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
c0a0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
c0b0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
c0c0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
c0d0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
c0e0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
c0f0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
c100: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
c110: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
c120: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
c130: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
c140: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
c150: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
c160: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
c170: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
c180: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
c190: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
c1a0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
c1b0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
c1c0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
c1d0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
c1e0: 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45  h..**.** IMPLEME
c1f0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34  NTATION-OF: R-34
c200: 32 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65  230-56049 SQLite
c210: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
c220: 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65  ncrements.** the
c230: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
c240: 77 68 65 6e 65 76 65 72 20 74 68 65 20 73 63 68  whenever the sch
c250: 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a  ema changes..*/.
c260: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
c270: 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a  geCookie(Parse *
c280: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
c290: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c2a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c2b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c2c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
c2d0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
c2e0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
c2f0: 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  b, 0) );.  sqlit
c300: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c310: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
c320: 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  b, BTREE_SCHEMA_
c330: 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20  VERSION, .      
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
c350: 74 29 28 31 2b 28 75 6e 73 69 67 6e 65 64 29 64  t)(1+(unsigned)d
c360: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
c370: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
c380: 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ie));.}../*.** M
c390: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
c3a0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
c3b0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
c3c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
c3d0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
c3e0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
c3f0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
c400: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
c410: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
c420: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
c430: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
c440: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
c450: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
c460: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
c470: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
c480: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
c490: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
c4a0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
c4b0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
c4c0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
c4d0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
c4e0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
c4f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c500: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
c510: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
c520: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
c530: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
c540: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
c550: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
c560: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c570: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
c580: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
c590: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
c5a0: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
c5b0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
c5c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
c5d0: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
c5e0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
c5f0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
c600: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
c610: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
c620: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
c630: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
c640: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
c650: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
c660: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
c670: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
c680: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
c690: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
c6a0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
c6b0: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
c6c0: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
c6d0: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
c6e0: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
c6f0: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
c700: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
c710: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
c720: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
c730: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
c740: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
c750: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
c760: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
c770: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
c780: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
c790: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
c7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7b0: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
c7c0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
c7d0: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
c7e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
c7f0: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
c800: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
c810: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
c820: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
c830: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
c840: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
c850: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
c860: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
c870: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
c880: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
c890: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
c8a0: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
c8b0: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
c8c0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
c8d0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
c8e0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
c8f0: 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20  )!=TK_ID.       
c900: 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a       || zIdent[j
c910: 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]!=0.           
c920: 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28   || j==0;..  if(
c930: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
c940: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
c950: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
c960: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
c970: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
c980: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
c990: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
c9a0: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
c9b0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c9c0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
c9d0: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
c9e0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
c9f0: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
ca00: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
ca10: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
ca20: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
ca30: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
ca40: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
ca50: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
ca60: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
ca70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
ca80: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
ca90: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
caa0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
cab0: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
cac0: 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65  TableStmt(sqlite
cad0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  3 *db, Table *p)
cae0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
caf0: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
cb00: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
cb10: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43  Sep2, *zEnd;.  C
cb20: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
cb30: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
cb40: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
cb50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
cb60: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
cb70: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
cb80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b  Col->zName) + 5;
cb90: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
cba0: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
cbb0: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
cbc0: 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b   .    zSep = "";
cbd0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
cbe0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
cbf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
cc00: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
cc10: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
cc20: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
cc30: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
cc40: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
cc50: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
cc60: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
cc70: 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d  n);.  if( zStmt=
cc80: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
cc90: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
cca0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ccb0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
ccc0: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
ccd0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
cce0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
ccf0: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
cd00: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
cd10: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
cd20: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
cd30: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
cd40: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
cd50: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
cd60: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
cd70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
cd80: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
cd90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
cda0: 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f  E_AFF_BLOB    */
cdb0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
cdc0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cdd0: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
cde0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cdf0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
ce00: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
ce10: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
ce20: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
ce30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
ce40: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
ce50: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
ce60: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
ce70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ce80: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
ce90: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cea0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
ceb0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
cec0: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
ced0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
cee0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
cef0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
cf00: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
cf10: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
cf20: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
cf30: 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29  _AFF_BLOB >= 0 )
cf40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cf50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
cf60: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41  ITE_AFF_BLOB < A
cf70: 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29  rraySize(azType)
cf80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cf90: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cfa0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
cfb0: 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
cfc0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cfd0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
cfe0: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
cff0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
d000: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
d010: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65  UMERIC );.    te
d020: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d030: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d040: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
d050: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d060: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d070: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20  TE_AFF_REAL );. 
d080: 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20     .    zType = 
d090: 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66  azType[pCol->aff
d0a0: 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41  inity - SQLITE_A
d0b0: 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65  FF_BLOB];.    le
d0c0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
d0d0: 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
d0e0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
d0f0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d100: 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20  FF_BLOB .       
d110: 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66       || pCol->af
d120: 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41  finity==sqlite3A
d130: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
d140: 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d  e, 0) );.    mem
d150: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
d160: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
d170: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
d180: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
d190: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
d1a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
d1b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
d1c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
d1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
d1e0: 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  e an Index objec
d1f0: 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75  t to hold N colu
d200: 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75  mns total.  Retu
d210: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
d220: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53  on success and S
d230: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61  QLITE_NOMEM on a
d240: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a  n OOM error..*/.
d250: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a  static int resiz
d260: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c  eIndexObject(sql
d270: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
d280: 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20  *pIdx, int N){. 
d290: 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20   char *zExtra;. 
d2a0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
d2b0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
d2c0: 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =N ) return SQLI
d2d0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
d2e0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
d2f0: 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ==0 );.  nByte =
d300: 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20   (sizeof(char*) 
d310: 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20  + sizeof(i16) + 
d320: 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d  1)*N;.  zExtra =
d330: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d340: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
d350: 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30  .  if( zExtra==0
d360: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d370: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d  _NOMEM_BKPT;.  m
d380: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
d390: 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65  dx->azColl, size
d3a0: 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e  of(char*)*pIdx->
d3b0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d3c0: 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73  ->azColl = (cons
d3d0: 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b  t char**)zExtra;
d3e0: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
d3f0: 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20  eof(char*)*N;.  
d400: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d410: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73  Idx->aiColumn, s
d420: 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d  izeof(i16)*pIdx-
d430: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d440: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
d450: 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45  16*)zExtra;.  zE
d460: 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
d470: 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28  16)*N;.  memcpy(
d480: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53  zExtra, pIdx->aS
d490: 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e  ortOrder, pIdx->
d4a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d4b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
d4c0: 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49  u8*)zExtra;.  pI
d4d0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b  dx->nColumn = N;
d4e0: 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a  .  pIdx->isResiz
d4f0: 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ed = 1;.  return
d500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d510: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d520: 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74  e total row widt
d530: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a  h for a table..*
d540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d550: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
d560: 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  (Table *pTab){. 
d570: 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65   unsigned wTable
d580: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f   = 0;.  const Co
d590: 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20  lumn *pTabCol;. 
d5a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
d5b0: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
d5c0: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
d5d0: 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f  i>0; i--, pTabCo
d5e0: 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65  l++){.    wTable
d5f0: 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45   += pTabCol->szE
d600: 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  st;.  }.  if( pT
d610: 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54  ab->iPKey<0 ) wT
d620: 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e  able++;.  pTab->
d630: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
d640: 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a  e3LogEst(wTable*
d650: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  4);.}../*.** Est
d660: 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
d670: 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20  e size of a row 
d680: 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f  for an index..*/
d690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
d6a0: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
d6b0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
d6c0: 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20  unsigned wIndex 
d6d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
d6e0: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43  const Column *aC
d6f0: 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ol = pIdx->pTabl
d700: 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69  e->aCol;.  for(i
d710: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
d720: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
d730: 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  16 x = pIdx->aiC
d740: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
d750: 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54  sert( x<pIdx->pT
d760: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  able->nCol );.  
d770: 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20    wIndex += x<0 
d780: 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d  ? 1 : aCol[pIdx-
d790: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a  >aiColumn[i]].sz
d7a0: 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d  Est;.  }.  pIdx-
d7b0: 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69  >szIdxRow = sqli
d7c0: 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78  te3LogEst(wIndex
d7d0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  *4);.}../* Retur
d7e0: 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20  n true if value 
d7f0: 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f  x is found any o
d800: 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c  f the first nCol
d810: 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f   entries of aiCo
d820: 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l[].*/.static in
d830: 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73  t hasColumn(cons
d840: 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e  t i16 *aiCol, in
d850: 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a  t nCol, int x){.
d860: 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20    while( nCol-- 
d870: 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61  > 0 ) if( x==*(a
d880: 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e  iCol++) ) return
d890: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
d8a0: 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75 74 65 20  }../* Recompute 
d8b0: 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20  the colNotIdxed 
d8c0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 49 6e 64  field of the Ind
d8d0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74  ex..**.** colNot
d8e0: 49 64 78 65 64 20 69 73 20 61 20 62 69 74 6d 61  Idxed is a bitma
d8f0: 73 6b 20 74 68 61 74 20 68 61 73 20 61 20 30 20  sk that has a 0 
d900: 62 69 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  bit representing
d910: 20 65 61 63 68 20 69 6e 64 65 78 65 64 0a 2a 2a   each indexed.**
d920: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
d930: 65 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  e within the fir
d940: 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66  st 63 columns of
d950: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
d960: 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65 72 20 62  .** high-order b
d970: 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49 64 78 65  it of colNotIdxe
d980: 64 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20 20  d is always 1.  
d990: 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64 20 63 6f  All unindexed co
d9a0: 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
d9b0: 74 61 62 6c 65 20 68 61 76 65 20 61 20 31 2e 0a  table have a 1..
d9c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 4e 6f 74  **.** The colNot
d9d0: 49 64 78 65 64 20 6d 61 73 6b 20 69 73 20 41 4e  Idxed mask is AN
d9e0: 44 2d 65 64 20 77 69 74 68 20 74 68 65 20 53 72  D-ed with the Sr
d9f0: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
da00: 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20 64 65 74  d mask.** to det
da10: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 69 6e  ermine if the in
da20: 64 65 78 20 69 73 20 63 6f 76 65 72 69 6e 67 20  dex is covering 
da30: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
da40: 20 76 6f 69 64 20 72 65 63 6f 6d 70 75 74 65 43   void recomputeC
da50: 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64  olumnsNotIndexed
da60: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
da70: 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
da80: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
da90: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
daa0: 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
dab0: 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
dac0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
dad0: 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
dae0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
daf0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
db00: 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
db10: 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  2 );.      if( x
db20: 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
db30: 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a  SKBIT(x);.    }.
db40: 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63 6f 6c 4e    }.  pIdx->colN
db50: 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b 0a 20 20  otIdxed = ~m;.  
db60: 61 73 73 65 72 74 28 20 28 70 49 64 78 2d 3e 63  assert( (pIdx->c
db70: 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36 33 29 3d  olNotIdxed>>63)=
db80: 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =1 );.}../*.** T
db90: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
dba0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
dbb0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
dbc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
dbd0: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
dbe0: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
dbf0: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
dc00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dc10: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
dc20: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
dc30: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
dc40: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
dc50: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
dc60: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
dc70: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
dc80: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
dc90: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
dca0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
dcb0: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
dcc0: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
dcd0: 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63 6f   (1)  Set all co
dce0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
dcf0: 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20  MARY KEY schema 
dd00: 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54  object to be NOT
dd10: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32   NULL..**     (2
dd20: 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70 61  )  Convert P3 pa
dd30: 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f  rameter of the O
dd40: 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 66 72  P_CreateBtree fr
dd50: 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  om BTREE_INTKEY 
dd60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74  .**          int
dd70: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
dd80: 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79 70  .**     (3)  Byp
dd90: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
dda0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
ddb0: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
ddc0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  y.**          fo
ddd0: 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  r the PRIMARY KE
dde0: 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72 79  Y as the primary
ddf0: 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f   key index is no
de00: 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64  w.**          id
de10: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
de20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
de30: 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65  ble entry of the
de40: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a   table itself..*
de50: 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20 74  *     (4)  Set t
de60: 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66  he Index.tnum of
de70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
de80: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
de90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dea0: 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72   schema to the r
deb0: 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ootpage from the
dec0: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20   main table..** 
ded0: 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c      (5)  Add all
dee0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74   table columns t
def0: 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  o the PRIMARY KE
df00: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a  Y Index object.*
df10: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68  *          so th
df20: 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  at the PRIMARY K
df30: 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  EY is a covering
df40: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72   index.  The sur
df50: 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  plus.**         
df60: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72   columns are par
df70: 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c  t of KeyInfo.nAl
df80: 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e  lField and are n
df90: 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ot used for.**  
dfa0: 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20          sorting 
dfb0: 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69  or lookup or uni
dfc0: 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a  queness checks..
dfd0: 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c  **     (6)  Repl
dfe0: 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61  ace the rowid ta
dff0: 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61  il on all automa
e000: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
e010: 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20  d UNIQUE.**     
e020: 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74       indices wit
e030: 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  h the PRIMARY KE
e040: 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  Y columns..**.**
e050: 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   For virtual tab
e060: 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73  les, only (1) is
e070: 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   performed..*/.s
e080: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
e090: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
e0a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
e0b0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
e0c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
e0d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
e0e0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
e0f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
e100: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e110: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
e120: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
e130: 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50   /* Mark every P
e140: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
e150: 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65  n as NOT NULL (e
e160: 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74  xcept for impost
e170: 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a  er tables).  */.
e180: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
e190: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b  imposterTable ){
e1a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e1b0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
e1c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  {.      if( (pTa
e1d0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
e1e0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
e1f0: 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20  IMKEY)!=0 ){.   
e200: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
e210: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f  i].notNull = OE_
e220: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
e230: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
e240: 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f 70  onvert the P3 op
e250: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
e260: 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f  CreateBtree opco
e270: 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  de from BTREE_IN
e280: 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42  TKEY.  ** into B
e290: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20  TREE_BLOBKEY..  
e2a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
e2b0: 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20  >addrCrTab ){.  
e2c0: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
e2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e2e0: 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73 65  angeP3(v, pParse
e2f0: 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54 52  ->addrCrTab, BTR
e300: 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d  EE_BLOBKEY);.  }
e310: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
e320: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
e330: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
e340: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
e350: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
e360: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
e370: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
e380: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
e390: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
e3a0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
e3b0: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
e3c0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
e3d0: 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b   Token ipkToken;
e3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
e3f0: 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c  nInit(&ipkToken,
e400: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
e410: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
e420: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
e430: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
e440: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e460: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
e470: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70  c(db, TK_ID, &ip
e480: 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  kToken, 0));.   
e490: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e4a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73  return;.    pLis
e4b0: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
e4c0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
e4d0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
e4e0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
e4f0: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
e500: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
e510: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
e520: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
e530: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30  pTab->keyConf, 0
e540: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45    SQLITE_IDXTYPE
e570: 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20  _PRIMARYKEY);.  
e580: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e590: 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
e5a0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
e5b0: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
e5c0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
e5d0: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61  x(pTab);.    pTa
e5e0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
e5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
e600: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e610: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e620: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
e630: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
e640: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
e650: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e660: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
e670: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
e680: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
e690: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
e6a0: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
e6b0: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
e6c0: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
e6d0: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
e6e0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
e6f0: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
e700: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
e710: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
e720: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
e730: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
e740: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
e750: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
e760: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e770: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
e780: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
e790: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
e7a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
e7b0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e7c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e7d0: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
e7e0: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73  l = j;.  }.  ass
e7f0: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
e800: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
e810: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d   = 1;.  if( !db-
e820: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
e830: 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e  ble ) pPk->uniqN
e840: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50  otNull = 1;.  nP
e850: 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
e860: 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74  ;..  /* Bypass t
e870: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
e880: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62  he PRIMARY KEY b
e890: 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c  tree and the sql
e8a0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
e8b0: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
e8c0: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
e8d0: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
e8e0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
e8f0: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
e900: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
e910: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
e920: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
e930: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74  ading.  ** a dat
e940: 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20  abase schema).  
e950: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
e960: 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  k->tnum>0 ){.   
e970: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
e980: 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
e990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e9a0: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d  geOpcode(v, pPk-
e9b0: 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b  >tnum, OP_Goto);
e9c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e9d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
e9e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
e9f0: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
ea00: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
ea10: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
ea20: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
ea30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
ea40: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
ea50: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
ea60: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
ea70: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
ea80: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
ea90: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
eaa0: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
eab0: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
eac0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ead0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
eae0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
eaf0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
eb00: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
eb10: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
eb20: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
eb30: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
eb40: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
eb50: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
eb60: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
eb70: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
eb80: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
eb90: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
eba0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
ebb0: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
ebc0: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
ebd0: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
ebe0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
ebf0: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
ec00: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
ec10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
ec20: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
ec30: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
ec40: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
ec50: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
ec60: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
ec70: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
ec80: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
ec90: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
eca0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
ecb0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
ecc0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
ecd0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
ece0: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
ecf0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
ed00: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
ed10: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
ed20: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed40: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
ed50: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
ed60: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
ed70: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
ed80: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
ed90: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
eda0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
edb0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
edc0: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
edd0: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
ede0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
edf0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
ee00: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
ee10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
ee20: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
ee30: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
ee40: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
ee50: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
ee60: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
ee70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
ee80: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
ee90: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
eea0: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
eeb0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
eec0: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
eed0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
eee0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
eef0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
ef00: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
ef10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ef20: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
ef30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
ef40: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
ef50: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  b->nCol;.  }.  r
ef60: 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
ef70: 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a  otIndexed(pPk);.
ef80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ef90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
efa0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
efb0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
efc0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
efd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
efe0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
eff0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
f000: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
f010: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
f020: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
f030: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
f040: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
f050: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
f060: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
f070: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
f080: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
f090: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
f0a0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
f0b0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
f0c0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
f0d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f0e0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
f0f0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
f100: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
f110: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
f120: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
f130: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f140: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
f150: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
f160: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
f170: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
f180: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f190: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
f1a0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
f1b0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
f1c0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
f1d0: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
f1e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f1f0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
f200: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
f210: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
f220: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
f230: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
f240: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
f250: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
f260: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
f270: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
f280: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
f290: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
f2a0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
f2b0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
f2c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f2d0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
f2e0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
f2f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
f300: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
f310: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
f320: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
f330: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
f340: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
f350: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
f360: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
f370: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
f380: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
f390: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
f3a0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
f3b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
f3c0: 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e  )' before option
f3d0: 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  s in the CREATE 
f3e0: 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61  TABLE */.  u8 ta
f3f0: 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20 20  bOpts,          
f400: 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c     /* Extra tabl
f410: 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c  e options. Usual
f420: 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  ly 0. */.  Selec
f430: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
f440: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
f450: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
f460: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
f470: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  .  Table *p;    
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f490: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  The new table */
f4a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f4b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
f4c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
f4d0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
f4e0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
f4f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
f500: 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  se in which the 
f510: 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20  table lives */. 
f520: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
f530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
f540: 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f   implied index o
f550: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  f the table */..
f560: 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26    if( pEnd==0 &&
f570: 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
f580: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f590: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
f5a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
f5b0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
f5c0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
f5d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
f5e0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
f5f0: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
f600: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
f610: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
f620: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
f630: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
f640: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
f650: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
f660: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
f670: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
f680: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
f690: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
f6a0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
f6b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
f6c0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
f6d0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
f6e0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
f6f0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
f700: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
f710: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
f720: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
f730: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
f740: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f750: 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 1, that means
f760: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71 6c   this is the sql
f770: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
f780: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53  table itself.  S
f790: 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f  o mark it read-o
f7a0: 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nly..  */.  if( 
f7b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f7c0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
f7d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f7e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f7f0: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
f800: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
f810: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
f820: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69  t.newTnum;.    i
f830: 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20  f( p->tnum==1 ) 
f840: 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
f850: 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a  F_Readonly;.  }.
f860: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72  .  /* Special pr
f870: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54  ocessing for WIT
f880: 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65  HOUT ROWID Table
f890: 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70  s */.  if( tabOp
f8a0: 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52  ts & TF_WithoutR
f8b0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20  owid ){.    if( 
f8c0: 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
f8d0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
f8e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f8f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f900: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55 54  ,.          "AUT
f910: 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61  OINCREMENT not a
f920: 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55  llowed on WITHOU
f930: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29  T ROWID tables")
f940: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
f950: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
f960: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
f970: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d  HasPrimaryKey)==
f980: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f990: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f9a0: 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20  e, "PRIMARY KEY 
f9b0: 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65  missing on table
f9c0: 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
f9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f9e0: 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d    p->tabFlags |=
f9f0: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
fa00: 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
fa10: 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
fa20: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
fa30: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
fa40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
fa50: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fa60: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
fa70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
fa80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fa90: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
faa0: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
fab0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
fac0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
fad0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
fae0: 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
faf0: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
fb00: 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
fb10: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
fb20: 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
fb30: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
fb40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fb50: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
fb60: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
fb70: 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
fb80: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
fb90: 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
fba0: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
fbb0: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
fbc0: 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
fbd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
fbe0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
fbf0: 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
fc00: 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
fc10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
fc20: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
fc30: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
fc40: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
fc50: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
fc60: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
fc70: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
fc80: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
fc90: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
fca0: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
fcb0: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
fcc0: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
fcd0: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
fce0: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
fcf0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
fd00: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
fd10: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
fd20: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
fd30: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
fd40: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
fd50: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
fd60: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
fd70: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
fd80: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
fd90: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
fda0: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
fdb0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
fdc0: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
fdd0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
fde0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
fdf0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fe00: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
fe10: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
fe20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe30: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
fe40: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20   0);..    /* .  
fe50: 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
fe60: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65  zType for the ne
fe70: 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e  w view or table.
fe80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fe90: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
fea0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
feb0: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
fec0: 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
fed0: 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
fee0: 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
fef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff00: 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
ff10: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
ff20: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
ff30: 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
ff40: 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
ff50: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
ff60: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
ff70: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
ff80: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
ff90: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
ffa0: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
ffb0: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
ffc0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
ffd0: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
ffe0: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
fff0: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
10000 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
10010 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
10020 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
10030 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
10040 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
10050 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
10060 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
10070 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
10080 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
10090 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
100a0 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
100b0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
100c0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
100d0 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
100e0 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
100f0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
10100 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
10110 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
10120 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
10130 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
10140 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
10150 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
10160 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
10170 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
10180 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
10190 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
101a0 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
101b0 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
101c0 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
101d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
101e0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ect ){.      Sel
101f0 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
10200 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53 45   /* Where the SE
10210 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72  LECT should stor
10220 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
10230 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b     int regYield;
10240 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10250 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f  er holding co-ro
10260 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e  utine entry-poin
10270 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10280 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f  ddrTop;        /
10290 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d  * Top of the co-
102a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
102b0 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20   int regRec;    
102c0 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64       /* A record
102d0 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e   to be insert in
102e0 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
102f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
10300 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a  gRowid;       /*
10310 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   Rowid of the ne
10320 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
10330 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
10340 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a  drInsLoop;    /*
10350 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
10360 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72   for inserting r
10370 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ows */.      Tab
10380 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20  le *pSelTab;    
10390 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74   /* A table that
103a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 53   describes the S
103b0 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
103c0 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c 64  ..      regYield
103d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
103e0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20  m;.      regRec 
103f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
10400 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
10410 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10420 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
10430 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
10440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
10450 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
10460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10470 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
10480 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
10490 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
104a0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
104b0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
104c0 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29   OPFLAG_P2ISREG)
104d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
104e0 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
104f0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
10500 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10510 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  (v) + 1;.      s
10520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10530 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
10540 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
10550 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
10560 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
10570 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
10580 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
10590 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
105a0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
105b0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
105c0 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
105d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
105e0 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
105f0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f   );.      p->nCo
10600 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
10610 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  l;.      p->aCol
10620 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
10630 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
10640 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
10650 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
10660 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
10670 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
10680 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
10690 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
106a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
106b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
106c0 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
106d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
106e0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
106f0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
10700 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
10710 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  turn;.      sqli
10720 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
10730 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
10740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10750 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10760 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20  ddrTop - 1);.   
10770 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
10780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10790 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
107a0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
107b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
107c0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
107d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
107e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
107f0 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
10800 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
10810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
10820 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
10830 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10840 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10850 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
10860 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10880 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
10890 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
108a0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
108b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
108c0 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
108d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
108e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
108f0 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
10900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10910 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
10920 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10930 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
10940 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
10950 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
10960 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
10970 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
10980 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
10990 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
109a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
109b0 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
109c0 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
109d0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
109e0 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
109f0 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
10a00 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10a10 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
10a20 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
10a30 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
10a40 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
10a50 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
10a60 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
10a70 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
10a80 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
10a90 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
10aa0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10ab0 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
10ac0 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
10ad0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
10ae0 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
10af0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
10b00 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
10b10 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
10b20 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
10b30 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
10b40 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
10b50 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
10b60 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10b70 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10b80 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
10b90 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
10ba0 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
10bb0 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
10bc0 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
10bd0 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
10be0 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
10bf0 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
10c00 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
10c10 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
10c20 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79 70  NAME,.      zTyp
10c30 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
10c40 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
10c50 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
10c60 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
10c70 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
10c80 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
10c90 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
10ca0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
10cb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
10cc0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10cd0 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
10ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10cf0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
10d00 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
10d10 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
10d20 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
10d30 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
10d40 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
10d50 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
10d60 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
10d70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
10d80 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
10d90 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
10da0 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
10db0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
10dc0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
10dd0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
10de0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
10df0 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
10e00 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
10e10 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
10e20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
10e30 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10e40 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10e50 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
10e60 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
10e70 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
10e80 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20   pDb->zDbSName. 
10e90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
10ea0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
10eb0 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
10ec0 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
10ed0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
10ee0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
10ef0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10f00 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
10f10 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
10f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
10f30 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
10f40 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
10f50 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
10f60 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
10f70 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
10f80 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
10f90 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
10fa0 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
10fb0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
10fc0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
10fd0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
10fe0 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
10ff0 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
11000 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
11010 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11020 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
11030 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
11040 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
11050 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
11060 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
11070 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
11080 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11090 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
110a0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
110b0 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
110c0 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
110d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
110e0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
110f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
11100 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
11110 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
11120 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
11130 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
11140 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
11150 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
11160 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
11170 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11180 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
11190 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
111a0 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
111b0 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
111c0 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
111d0 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
111e0 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
111f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
11200 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
11210 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
11220 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
11230 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
11240 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
11250 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
11260 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
11270 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
11280 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
11290 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
112a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
112b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
112c0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
112d0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
112e0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
112f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
11300 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
11310 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
11320 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
11330 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
11340 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
11350 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
11360 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
11370 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
11380 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
11390 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
113a0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
113b0 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
113c0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
113d0 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
113e0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
113f0 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
11400 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
11410 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11420 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
11430 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
11440 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
11450 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
11460 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
11470 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
11480 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11490 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
114a0 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
114b0 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
114c0 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
114d0 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
114e0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
114f0 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
11500 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
11510 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
11520 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
11530 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
11540 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
11550 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
11560 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
11570 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
11580 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
11590 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
115a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
115b0 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
115c0 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
115d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
115e0 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
115f0 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
11600 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
11610 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
11620 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
11630 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
11640 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
11650 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
11660 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
11670 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
11680 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
11690 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
116a0 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
116b0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
116c0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
116d0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
116e0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
116f0 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
11700 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
11710 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
11720 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
11730 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
11740 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
11750 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
11760 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
11770 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
11780 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11790 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
117a0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
117b0 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
117c0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
117d0 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
117e0 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
117f0 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
11800 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
11810 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
11820 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
11830 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
11840 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
11850 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
11860 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
11870 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
11880 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
11890 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
118a0 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
118b0 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45    */.  if( IN_RE
118c0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
118d0 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
118e0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65  pSelect;.    pSe
118f0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lect = 0;.  }els
11900 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  e{.    p->pSelec
11910 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
11920 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
11930 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
11940 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65  );.  }.  p->pChe
11950 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
11960 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
11970 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
11980 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
11990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
119a0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
119b0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
119c0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
119d0 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
119e0 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
119f0 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
11a00 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
11a10 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
11a20 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
11a30 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
11a40 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
11a50 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
11a60 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
11a70 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
11a80 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
11a90 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
11aa0 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
11ab0 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
11ac0 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
11ad0 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
11ae0 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
11af0 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
11b00 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
11b10 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
11b20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
11b30 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
11b40 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
11b50 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
11b60 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
11b70 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
11b80 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
11b90 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
11ba0 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
11bb0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11bc0 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
11bd0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
11be0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
11bf0 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c 69  ite3RenameExprli
11c00 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  stUnmap(pParse, 
11c10 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20  pCNames);.  }.  
11c20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11c30 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
11c40 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
11c50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11c60 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
11c70 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
11c80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
11c90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11ca0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11cb0 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
11cc0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
11cd0 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
11ce0 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
11cf0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
11d00 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11d10 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
11d20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
11d30 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
11d40 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
11d50 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
11d60 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
11d70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
11d80 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
11d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11da0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
11db0 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
11dc0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
11dd0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
11de0 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
11df0 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
11e00 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
11e10 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
11e20 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
11e30 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
11e40 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
11e50 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
11e60 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
11e70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11e80 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
11e90 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
11ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
11eb0 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
11ec0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
11ed0 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
11ee0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11ef0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
11f00 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11f10 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
11f20 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64   errors */.#ifnd
11f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11f40 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
11f50 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  t rc;.#endif.#if
11f60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11f70 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11f80 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
11f90 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
11fa0 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
11fb0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
11fc0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
11fd0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
11fe0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11ff0 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  BLE.  db->nSchem
12000 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20  aLock++;.  rc = 
12010 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
12020 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
12030 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53  Table);.  db->nS
12040 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69  chemaLock--;.  i
12050 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
12060 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
12070 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
12080 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
12090 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
120a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
120b0 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
120c0 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
120d0 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
120e0 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
120f0 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
12100 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
12110 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
12120 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
12130 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
12140 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
12150 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
12160 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
12170 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
12180 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
12190 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
121a0 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
121b0 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
121c0 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
121d0 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
121e0 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
121f0 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
12200 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
12210 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
12220 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
12230 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
12240 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
12250 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
12260 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
12270 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
12280 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
12290 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
122a0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
122b0 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
122c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
122d0 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
122e0 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
122f0 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
12300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
12310 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
12320 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
12330 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
12340 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
12350 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
12360 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
12370 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12380 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
12390 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
123a0 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
123b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
123c0 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
123d0 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
123e0 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
123f0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
12400 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
12410 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
12420 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
12430 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
12440 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
12450 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
12460 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
12470 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
12480 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
12490 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
124a0 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
124b0 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
124c0 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
124d0 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
124e0 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
124f0 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
12500 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
12510 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
12520 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
12530 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
12540 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
12550 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
12560 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
12570 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
12580 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
12590 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
125a0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
125b0 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
125c0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
125d0 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
125e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
125f0 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
12600 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
12610 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66   pSel ){.#ifndef
12620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
12630 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20 65  ERTABLE.    u8 e
12640 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61 72  ParseMode = pPar
12650 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a  se->eParseMode;.
12660 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72      pParse->ePar
12670 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d  seMode = PARSE_M
12680 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64  ODE_NORMAL;.#end
12690 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  if.    n = pPars
126a0 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
126b0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
126c0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
126d0 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
126e0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
126f0 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
12700 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
12710 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
12720 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
12730 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
12740 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
12750 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
12760 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12770 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12780 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12790 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
127a0 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
127b0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
127c0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
127d0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
127e0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
127f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
12800 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
12810 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
12820 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
12830 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
12840 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
12850 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
12860 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
12870 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
12880 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
12890 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
128a0 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
128b0 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
128c0 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
128d0 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
128e0 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
128f0 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
12900 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
12910 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
12920 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
12930 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
12940 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
12950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
12960 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
12970 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12980 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
129b0 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
129c0 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
129d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
129e0 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
129f0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
12a00 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
12a10 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
12a20 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
12a30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12a40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12a50 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12a60 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12a70 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
12a80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12a90 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
12aa0 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12ab0 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
12ac0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
12ad0 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
12ae0 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
12af0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
12b00 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
12b10 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
12b20 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
12b30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12b40 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
12b50 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
12b60 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12b70 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
12b80 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
12b90 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
12ba0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
12bb0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
12bc0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
12bd0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
12be0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12bf0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
12c00 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
12c10 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
12c20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
12c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
12c40 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
12c50 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12c60 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
12c70 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12c80 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12c90 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
12ca0 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
12cb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12cc0 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
12cd0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
12ce0 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73 65  rseMode = eParse
12cf0 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Mode;.#endif.  }
12d00 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
12d10 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  ++;.  }.  pTable
12d20 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
12d30 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
12d40 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66 28  esetViews;.  if(
12d50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12d60 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
12d70 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
12d80 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
12d90 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
12da0 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  = 0;.    pTable-
12db0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23  >nCol = 0;.  }.#
12dc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12dd0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
12de0 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
12df0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
12e00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12e10 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
12e20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
12e30 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
12e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12e50 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
12e60 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
12e70 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
12e80 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
12e90 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
12ea0 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
12eb0 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
12ec0 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
12ed0 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
12ee0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12ef0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12f00 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20  b, idx, 0) );.  
12f10 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
12f20 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
12f30 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
12f40 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
12f50 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
12f60 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
12f70 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
12f80 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
12f90 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
12fa0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12fb0 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
12fc0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
12fd0 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
12fe0 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
12ff0 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
13000 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
13010 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
13020 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
13030 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
13040 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
13050 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
13060 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
13070 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
13080 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
13090 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
130a0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
130b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
130c0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
130d0 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
130e0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
130f0 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
13100 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
13110 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
13120 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
13130 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
13140 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
13150 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
13160 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
13170 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
13180 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
13190 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
131a0 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
131b0 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
131c0 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
131d0 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
131e0 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
131f0 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
13200 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
13210 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
13220 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
13230 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
13240 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
13250 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
13260 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
13270 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
13280 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
13290 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
132a0 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
132b0 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
132c0 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
132d0 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
132e0 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
132f0 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
13300 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
13310 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
13320 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
13330 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
13340 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
13350 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
13360 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
13370 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
13380 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
13390 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
133a0 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
133b0 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
133c0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
133d0 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
133e0 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
133f0 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
13400 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
13410 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
13420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13430 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
13440 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
13450 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
13460 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13470 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
13480 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
13490 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
134a0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
134b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
134c0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
134d0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
134e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
134f0 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
13500 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
13510 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
13520 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
13530 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
13540 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
13550 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
13560 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
13570 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13580 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
13590 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
135a0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
135b0 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
135c0 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
135d0 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
135e0 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
135f0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13600 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
13610 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
13620 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
13630 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
13640 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
13650 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
13660 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
13670 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
13680 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
13690 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
136a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
136b0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
136c0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
136d0 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
136e0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
136f0 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
13700 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
13710 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
13720 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
13730 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
13740 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
13750 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
13760 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
13770 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
13780 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
13790 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
137a0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
137b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
137c0 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
137d0 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
137e0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
137f0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
13800 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
13810 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13820 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
13830 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
13840 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13850 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 32  ;.  if( iTable<2
13860 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d   ) sqlite3ErrorM
13870 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
13880 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20 20  upt schema");.  
13890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
138a0 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
138b0 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
138c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
138d0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
138e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
138f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
13900 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
13910 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
13920 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
13930 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
13940 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
13950 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
13960 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
13970 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
13980 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
13990 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
139a0 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
139b0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
139c0 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
139d0 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
139e0 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
139f0 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
13a00 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
13a10 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
13a20 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
13a30 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
13a40 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
13a50 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
13a60 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
13a70 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
13a80 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
13a90 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
13aa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
13ab0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
13ac0 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
13ad0 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
13ae0 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
13af0 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
13b00 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
13b10 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
13b20 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
13b30 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  E, iTable, r1, r
13b40 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
13b50 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13b60 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13b70 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
13b80 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
13b90 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
13ba0 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
13bb0 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
13bc0 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
13bd0 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
13be0 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
13bf0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
13c00 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
13c10 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
13c20 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
13c30 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
13c40 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
13c50 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
13c60 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
13c70 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
13c80 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
13c90 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
13ca0 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
13cb0 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
13cc0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
13cd0 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b){.  /* If the 
13ce0 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
13cf0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
13d00 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
13d10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13d20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
13d30 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
13d40 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
13d50 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
13d60 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
13d70 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
13d80 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
13d90 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
13da0 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
13db0 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
13dc0 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
13dd0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
13de0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
13df0 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
13e00 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
13e10 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
13e20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
13e30 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
13e40 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
13e50 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
13e60 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
13e70 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
13e80 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
13e90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
13ea0 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
13eb0 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
13ec0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
13ed0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
13ee0 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
13ef0 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
13f00 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
13f10 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
13f20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
13f30 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
13f40 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
13f50 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
13f60 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
13f70 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
13f80 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
13f90 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
13fa0 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
13fb0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
13fc0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
13fd0 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
13fe0 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
13ff0 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
14000 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
14010 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
14020 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
14030 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
14040 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
14050 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
14060 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
14070 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
14080 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
14090 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
140a0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
140b0 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
140c0 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
140d0 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
140e0 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
140f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
14100 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
14110 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
14120 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
14130 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
14140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14150 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
14160 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
14170 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
14180 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
14190 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
141a0 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
141b0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
141c0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
141d0 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
141e0 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
141f0 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
14200 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
14210 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
14220 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
14230 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
14240 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28  bles (for N in (
14250 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72  1,2,3)).** after
14260 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72   a DROP INDEX or
14270 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
14280 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  and..*/.static v
14290 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
142a0 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61  StatTables(.  Pa
142b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
142c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
142d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
142e0 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20   int iDb,       
142f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
14300 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
14310 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14320 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69  zType,     /* "i
14330 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a  dx" or "tbl" */.
14340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
14350 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame      /* Name
14360 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62   of index or tab
14370 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
14380 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14390 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65  zDbName = pParse
143a0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
143b0 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69  DbSName;.  for(i
143c0 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a  =1; i<=4; i++){.
143d0 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34      char zTab[24
143e0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
143f0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
14400 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74  Tab),zTab,"sqlit
14410 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20  e_stat%d",i);.  
14420 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
14430 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
14440 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65  b, zTab, zDbName
14450 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
14460 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
14470 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
14480 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
14490 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20   WHERE %s=%Q",. 
144a0 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20         zDbName, 
144b0 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61  zTab, zType, zNa
144c0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
144d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
144e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
144f0 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  drop a table..*/
14500 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
14510 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  eDropTable(Parse
14520 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
14530 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20  *pTab, int iDb, 
14540 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56  int isView){.  V
14550 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
14560 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14570 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70  db;.  Trigger *p
14580 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70  Trigger;.  Db *p
14590 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
145a0 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  b];..  v = sqlit
145b0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
145c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
145d0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  0 );.  sqlite3Be
145e0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
145f0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
14600 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
14610 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14620 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
14630 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14650 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
14660 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
14670 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
14680 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
14690 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
146a0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
146b0 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65  ode.  ** is gene
146c0 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  rated to remove 
146d0 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c  entries from sql
146e0 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f  ite_master and/o
146f0 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65  r.  ** sqlite_te
14700 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71  mp_master if req
14710 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54  uired..  */.  pT
14720 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
14730 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
14740 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69  se, pTab);.  whi
14750 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
14760 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
14770 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  gger->pSchema==p
14780 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20  Tab->pSchema || 
14790 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
147a0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
147b0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
147c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f  ;.    sqlite3Dro
147d0 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
147e0 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
147f0 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
14800 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
14810 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14820 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
14830 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
14840 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66  e any entries of
14850 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
14860 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63  ence table assoc
14870 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  iated with.  ** 
14880 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
14890 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
148a0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
148b0 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
148c0 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74  d.  ** at the bt
148d0 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
148e0 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
148f0 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
14900 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20  ds to.  ** move 
14910 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
14920 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70  he drop (can hap
14930 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
14940 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20  um mode)..  */. 
14950 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
14960 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
14970 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  rement ){.    sq
14980 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14990 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
149a0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
149b0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57  qlite_sequence W
149c0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
149d0 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
149e0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
149f0 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
14a00 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
14a10 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
14a20 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
14a30 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
14a40 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
14a50 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
14a60 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
14a70 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
14a80 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
14a90 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
14aa0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
14ab0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
14ac0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
14ad0 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
14ae0 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
14af0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
14b00 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
14b10 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
14b20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
14b30 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
14b40 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
14b50 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
14b60 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
14b70 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
14b80 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
14b90 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
14ba0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
14bb0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
14bc0 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
14bd0 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
14be0 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ->zDbSName, MAST
14bf0 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e 7a  ER_NAME, pTab->z
14c00 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73  Name);.  if( !is
14c10 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
14c20 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14c30 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
14c40 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  rse, pTab);.  }.
14c50 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
14c60 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
14c70 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
14c80 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
14c90 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73  odify.  ** the s
14ca0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20  chema cookie..  
14cb0 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
14cc0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ce0 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
14cf0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
14d00 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
14d10 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14d20 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
14d30 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
14d40 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
14d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e  );.  sqlite3Chan
14d60 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
14d70 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56   iDb);.  sqliteV
14d80 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
14d90 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
14da0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
14db0 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
14dc0 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
14dd0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
14de0 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
14df0 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
14e00 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
14e10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14e20 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
14e30 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
14e40 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
14e50 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
14e60 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
14e70 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
14e80 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
14e90 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
14ea0 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
14eb0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14ec0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
14ed0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
14ee0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14ef0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
14f00 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
14f10 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
14f20 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
14f30 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
14f40 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66  drop_table;.  if
14f50 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
14f60 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61  ppressErr++;.  a
14f70 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30  ssert( isView==0
14f80 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41   || isView==LOCA
14f90 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61  TE_VIEW );.  pTa
14fa0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
14fb0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
14fc0 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d  e, isView, &pNam
14fd0 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20  e->a[0]);.  if( 
14fe0 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
14ff0 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66  ressErr--;..  if
15000 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
15010 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c   if( noErr ) sql
15020 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
15030 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
15040 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
15050 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f  atabase);.    go
15060 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15070 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
15080 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
15090 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
150a0 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
150b0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
150c0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
150d0 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
150e0 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
150f0 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
15100 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
15110 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
15120 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
15130 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
15140 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
15150 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
15160 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
15170 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
15180 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
15190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
151a0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
151b0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
151c0 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
151d0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
151e0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
151f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15200 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
15210 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
15220 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
15230 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
15240 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15250 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
15260 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
15270 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
15280 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
15290 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
152a0 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
152b0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
152c0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
152d0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
152e0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
152f0 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
15300 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
15310 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
15320 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
15330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15340 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
15350 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
15360 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15370 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
15380 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
15390 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
153a0 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
153b0 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
153c0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
153d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
153e0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
153f0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
15400 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
15410 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
15420 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15430 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
15440 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
15450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15460 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15470 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15480 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
15490 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
154a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
154b0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
154c0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
154d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
154e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
154f0 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
15500 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
15510 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15520 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
15530 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
15540 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
15550 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
15560 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
15570 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
15580 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
15590 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
155a0 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
155b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
155c0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
155d0 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
155e0 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
155f0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
15600 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
15610 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15620 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
15630 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
15640 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
15650 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
15660 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
15670 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
15680 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
15690 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
156a0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
156b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
156c0 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
156d0 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
156e0 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
156f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
15700 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15710 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
15720 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
15730 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
15740 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15750 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
15760 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
15770 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
15780 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
15790 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
157a0 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
157b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
157c0 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
157d0 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
157e0 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
157f0 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
15800 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15810 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15820 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
15830 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
15840 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
15850 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28  1, iDb);.    if(
15860 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
15870 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
15880 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
15890 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61   iDb, "tbl", pTa
158a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
158b0 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61   sqlite3FkDropTa
158c0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
158d0 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
158e0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44      sqlite3CodeD
158f0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
15900 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69   pTab, iDb, isVi
15910 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64  ew);.  }..exit_d
15920 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
15930 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
15940 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a  e(db, pName);.}.
15950 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15960 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
15970 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f   create a new fo
15980 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65  reign key on the
15990 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e   table.** curren
159a0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
159b0 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f  uction.  pFromCo
159c0 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  l determines whi
159d0 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  ch columns.** in
159e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
159f0 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  le point to the 
15a00 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66  foreign key.  If
15a10 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65   pFromCol==0 the
15a20 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65  n.** connect the
15a30 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74   key to the last
15a40 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64   column inserted
15a50 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61  .  pTo is the na
15a60 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62  me of.** the tab
15a70 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28  le referred to (
15a80 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e  a.k.a the "paren
15a90 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43  t" table).  pToC
15aa0 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20  ol is a list.** 
15ab0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
15ac0 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c   parent pTo tabl
15ad0 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69  e.  flags contai
15ae0 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  ns all.** inform
15af0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
15b00 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
15b10 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73  ion algorithms s
15b20 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74  pecified.** in t
15b30 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e  he ON DELETE, ON
15b40 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49   UPDATE and ON I
15b50 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a  NSERT clauses..*
15b60 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72  *.** An FKey str
15b70 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
15b80 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  d and added to t
15b90 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
15ba0 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ly.** under cons
15bb0 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
15bc0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15bd0 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  e field..**.** T
15be0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
15bf0 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
15c00 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
15c10 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
15c20 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
15c30 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15c40 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
15c50 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
15c60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15c70 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
15c80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15c90 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
15ca0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15cb0 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
15cc0 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
15cd0 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
15ce0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
15cf0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
15d00 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
15d10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15d20 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
15d30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
15d40 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
15d50 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
15d60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
15d70 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
15d80 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
15d90 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
15da0 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  s. */.){.  sqlit
15db0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15dc0 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
15dd0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
15de0 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b  _KEY.  FKey *pFK
15df0 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a  ey = 0;.  FKey *
15e00 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65  pNextTo;.  Table
15e10 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
15e20 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
15e30 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
15e40 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
15e50 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
15e60 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
15e70 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c   p==0 || IN_DECL
15e80 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
15e90 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
15ea0 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
15eb0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
15ec0 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e  Col-1;.    if( N
15ed0 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67  EVER(iCol<0) ) g
15ee0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
15ef0 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
15f00 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
15f10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
15f20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15f30 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
15f40 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
15f50 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
15f60 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
15f70 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
15f80 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
15f90 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
15fa0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
15fb0 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
15fc0 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
15fd0 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15fe0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
15ff0 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
16000 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16010 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
16020 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
16030 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
16040 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
16050 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
16060 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
16070 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
16080 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
16090 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
160a0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
160b0 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
160c0 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
160d0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
160e0 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a  Key) + (nCol-1)*
160f0 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
16100 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
16110 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
16120 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
16130 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
16140 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
16150 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  Byte += sqlite3S
16160 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
16170 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
16180 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
16190 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
161a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
161b0 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
161c0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  y==0 ){.    goto
161d0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70   fk_end;.  }.  p
161e0 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
161f0 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
16200 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
16210 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
16220 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b  Key->aCol[nCol];
16230 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
16240 7a 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  z;.  if( IN_RENA
16250 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
16260 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
16270 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
16280 76 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20  void*)z, pTo);. 
16290 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70   }.  memcpy(z, p
162a0 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
162b0 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
162c0 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
162d0 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f  e(z);.  z += pTo
162e0 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
162f0 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
16300 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
16310 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
16320 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
16330 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
16340 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16350 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
16360 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
16370 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
16380 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
16390 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
163a0 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
163b0 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
163c0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
163d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
163e0 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
163f0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
16400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16420 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
16430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16440 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16450 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
16460 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
16470 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
16480 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
16490 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
164a0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
164b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
164c0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
164d0 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
164e0 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
164f0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
16500 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
16510 73 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c  se, &pFKey->aCol
16520 5b 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  [i], pFromCol->a
16530 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
16540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
16550 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
16560 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
16570 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
16580 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
16590 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
165a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
165b0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
165c0 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
165d0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
165e0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  BJECT ){.       
165f0 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
16600 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c  kenRemap(pParse,
16610 20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d   z, pToCol->a[i]
16620 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
16630 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
16640 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
16650 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
16660 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
16670 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
16680 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
16690 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
166a0 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20  Key->aAction[0] 
166b0 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30  = (u8)(flags & 0
166c0 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20  xff);           
166d0 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63   /* ON DELETE ac
166e0 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  tion */.  pFKey-
166f0 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75  >aAction[1] = (u
16700 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29  8)((flags >> 8 )
16710 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20   & 0xff);    /* 
16720 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
16730 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
16740 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
16750 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e  xHeld(db, 0, p->
16760 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e  pSchema) );.  pN
16770 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29  extTo = (FKey *)
16780 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
16790 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  t(&p->pSchema->f
167a0 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20  keyHash, .      
167b0 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69  pFKey->zTo, (voi
167c0 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20  d *)pFKey.  );. 
167d0 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46   if( pNextTo==pF
167e0 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
167f0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
16800 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16810 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
16820 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
16830 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
16840 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
16850 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
16860 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
16870 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
16880 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
16890 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
168a0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
168b0 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
168c0 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
168d0 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
168e0 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
168f0 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
16900 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
16910 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
16920 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
16930 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
16940 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16950 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
16960 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
16970 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
16980 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
16990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
169a0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
169b0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
169c0 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
169d0 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
169e0 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
169f0 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
16a00 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
16a10 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
16a20 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
16a30 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
16a40 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
16a50 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
16a60 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
16a70 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
16a80 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
16a90 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
16aa0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
16ab0 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
16ac0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
16ad0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
16ae0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
16af0 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
16b00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b10 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
16b20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
16b30 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
16b40 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
16b50 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
16b60 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
16b70 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
16b80 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
16b90 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
16ba0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
16bb0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
16bc0 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
16bd0 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
16be0 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
16bf0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
16c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
16c10 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
16c20 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
16c30 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
16c40 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
16c50 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
16c60 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
16c70 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
16c80 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
16c90 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
16ca0 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
16cb0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
16cc0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
16cd0 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
16ce0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
16cf0 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
16d00 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
16d10 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
16d20 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
16d30 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
16d40 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
16d50 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
16d60 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
16d70 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
16d80 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
16d90 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
16da0 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
16db0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
16dc0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
16dd0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
16de0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
16df0 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
16e00 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
16e10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
16e20 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
16e30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
16e40 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
16e50 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
16e60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
16e70 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
16e80 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
16e90 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
16ea0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
16eb0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
16ec0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
16ed0 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
16ee0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
16ef0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
16f00 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16f10 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
16f20 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
16f30 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
16f40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
16f50 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
16f60 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
16f70 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
16f80 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16f90 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16fa0 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
16fb0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16fe0 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
16ff0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
17000 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17030 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
17040 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
17050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
17060 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
17070 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20  l to skip a row 
17080 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
170b0 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
170c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
170d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
170e0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
170f0 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
17100 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
17110 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
17120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17130 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
17140 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20  assembled index 
17150 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
17160 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17170 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
17180 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
17190 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
171a0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
171b0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
171c0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
171d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
171e0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
171f0 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
17200 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17210 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
17220 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
17230 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
17240 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20  b[iDb].zDbSName 
17250 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
17260 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17270 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
17280 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
17290 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
172a0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
172b0 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
172c0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
172d0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
172e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
172f0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
17300 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
17310 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
17320 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
17330 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
17340 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
17350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
17360 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
17370 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
17380 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
17390 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
173a0 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74  Index);.  assert
173b0 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d  ( pKey!=0 || db-
173c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
173d0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
173e0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
173f0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66  sorter cursor if
17400 20 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f   we are to use o
17410 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72  ne. */.  iSorter
17420 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17430 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
17440 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
17450 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72  terOpen, iSorter
17460 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  , 0, pIndex->nKe
17470 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20  yCol, (char*).  
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17490 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
174a0 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45  Ref(pKey), P4_KE
174b0 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70  YINFO);..  /* Op
174c0 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f  en the table. Lo
174d0 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72  op through all r
174e0 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
174f0 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65  , inserting inde
17500 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69  x.  ** records i
17510 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20  nto the sorter. 
17520 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  */.  sqlite3Open
17530 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
17540 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
17550 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
17560 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
17570 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17580 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
17590 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
175a0 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
175b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
175c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
175d0 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70  ite3MultiWrite(p
175e0 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74  Parse);..  sqlit
175f0 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b  e3GenerateIndexK
17600 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78  ey(pParse,pIndex
17610 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c  ,iTab,regRecord,
17620 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c  0,&iPartIdxLabel
17630 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,0,0);.  sqlite3
17640 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17650 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69  _SorterInsert, i
17660 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
17670 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  d);.  sqlite3Res
17680 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c  olvePartIdxLabel
17690 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49 64  (pParse, iPartId
176a0 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  xLabel);.  sqlit
176b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
176c0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
176d0 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
176e0 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
176f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17700 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28  v, addr1);.  if(
17710 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29   memRootPage<0 )
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20  p2(v, OP_Clear, 
17740 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71  tnum, iDb);.  sq
17750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17760 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
17770 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62   iIdx, tnum, iDb
17780 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17790 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70         (char *)p
177a0 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  Key, P4_KEYINFO)
177b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
177c0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
177d0 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52  G_BULKCSR|((memR
177e0 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c  ootPage>=0)?OPFL
177f0 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a  AG_P2ISREG:0));.
17800 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
17810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17820 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
17830 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65  Sorter, 0); Vdbe
17840 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69  Coverage(v);.  i
17850 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
17860 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
17870 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
17880 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a  VdbeGoto(v, 1);.
17890 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
178a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
178b0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
178c0 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
178d0 74 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72  table(v, OE_Abor
178e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
178f0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
17900 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
17910 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
17920 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43     pIndex->nKeyC
17950 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
17960 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
17970 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
17980 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f  t(pParse, OE_Abo
17990 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  rt, pIndex);.   
179a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
179b0 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d  Here(v, j2);.  }
179c0 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20  else{.    addr2 
179d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
179e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
179f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17a00 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
17a10 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
17a20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29  regRecord, iIdx)
17a30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17a40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp1(v, OP_Seek
17a50 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  End, iIdx);.  sq
17a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17a70 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
17a80 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
17a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17aa0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
17ab0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
17ac0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
17ad0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
17ae0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
17af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17b00 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
17b10 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
17b20 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
17b30 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
17b40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17b50 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
17b60 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17b70 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
17b80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17b90 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
17ba0 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
17bb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17bc0 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
17bd0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
17be0 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
17bf0 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
17c00 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
17c10 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
17c20 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
17c30 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
17c40 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
17c50 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
17c60 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
17c70 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
17c80 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
17c90 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
17ca0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
17cb0 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
17cc0 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
17cd0 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
17ce0 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
17cf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17d00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
17d10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17d20 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
17d30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
17d40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
17d50 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
17d60 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
17d70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
17d80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17d90 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
17da0 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
17db0 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
17dc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
17dd0 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
17de0 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
17df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17e00 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
17e10 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
17e20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
17e30 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
17e40 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
17e50 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
17e60 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
17e70 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
17e80 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
17e90 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
17ea0 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
17eb0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
17ec0 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
17ed0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
17ee0 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
17ef0 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
17f00 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
17f10 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
17f20 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
17f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17f40 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
17f50 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
17f60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
17f70 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17f90 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
17fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17fb0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
17fc0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
17fd0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
17fe0 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
17ff0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
18000 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
18010 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
18020 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
18030 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
18040 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70   (const char**)p
18050 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
18060 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
18070 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
18080 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
18090 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
180a0 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
180b0 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
180c0 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
180d0 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
180e0 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
180f0 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
18100 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
18110 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
18120 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
18130 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
18140 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
18150 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
18160 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
18170 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
18180 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
18190 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
181a0 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
181b0 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
181c0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
181d0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
181e0 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
181f0 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
18200 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
18210 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
18220 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
18230 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
18240 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18250 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
18260 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
18270 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
18280 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
18290 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
182a0 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
182b0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
182c0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
182d0 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
182e0 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
182f0 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
18300 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
18310 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
18320 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
18330 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
18340 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
18350 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
18360 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
18370 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
18380 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
18390 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
183a0 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
183b0 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
183c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
183d0 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
183e0 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
183f0 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
18400 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64  ction.  .*/.void
18410 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
18420 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
18430 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
18440 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
18450 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
18460 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
18470 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
18480 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
18490 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
184a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
184b0 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
184c0 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
184d0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
184e0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
184f0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
18500 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
18510 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18520 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
18530 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
18540 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
18550 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
18560 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
18570 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
18580 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
18590 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
185a0 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
185b0 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
185c0 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
185d0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
185e0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
185f0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68  */.  Expr *pPIWh
18600 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45  ere,    /* WHERE
18610 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74   clause for part
18620 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ial indices */. 
18630 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
18640 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
18650 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
18660 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
18670 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
18680 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69  Exist,    /* Omi
18690 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
186a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
186b0 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65 20  */.  u8 idxType 
186c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
186d0 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  ndex type */.){.
186e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
186f0 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
18700 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
18710 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
18720 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
18730 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
18740 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
18750 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
18760 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
18770 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
18780 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
18790 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
187a0 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
187b0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62    int i, j;.  Db
187c0 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
187d0 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
187e0 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
187f0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
18800 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
18810 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
18820 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
18830 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
18840 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
18850 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18860 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
18870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
18880 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
18890 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
188a0 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
188b0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
188c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
188d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
188e0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
188f0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
18900 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
18910 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
18920 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
18930 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
18940 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
18950 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
18960 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
18970 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
18980 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
189b0 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
189c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
189d0 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
189e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
189f0 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
18a00 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
18a10 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
18a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a30 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
18a40 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
18a50 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
18a60 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
18a70 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
18a80 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
18a90 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
18aa0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
18ab0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
18ac0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
18ad0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18ae0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
18af0 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56  if( IN_DECLARE_V
18b00 54 41 42 20 26 26 20 69 64 78 54 79 70 65 21 3d  TAB && idxType!=
18b10 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
18b20 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20  RIMARYKEY ){.   
18b30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18b40 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
18b50 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
18b60 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
18b70 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
18b80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18b90 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
18ba0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
18bb0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
18bc0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
18bd0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
18be0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
18bf0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
18c00 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
18c10 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
18c20 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
18c30 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
18c40 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
18c50 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
18c60 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
18c70 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
18c80 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
18c90 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
18ca0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
18cb0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
18cc0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
18cd0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
18ce0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
18cf0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
18d00 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
18d10 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
18d20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18d30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18d40 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
18d50 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
18d60 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
18d70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
18d80 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
18d90 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
18da0 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
18db0 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
18dc0 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
18dd0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
18de0 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
18df0 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
18e00 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
18e10 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
18e20 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
18e30 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
18e40 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
18e50 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
18e60 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
18e70 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
18e80 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
18e90 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
18ea0 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
18eb0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
18ec0 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
18ed0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18ee0 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69     sqlite3FixIni
18ef0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
18f00 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
18f10 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
18f20 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
18f30 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
18f40 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65  ) ){.      /* Be
18f50 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
18f60 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
18f70 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
18f80 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
18f90 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
18fa0 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
18fb0 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
18fc0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
18fd0 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
18fe0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
18ff0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
19000 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
19010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
19020 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
19030 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b  =0 || pTab==0 );
19040 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
19050 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19060 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
19070 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d  f( iDb==1 && db-
19080 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
19090 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a!=pTab->pSchema
190a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
190b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
190c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  , .           "c
190d0 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54  annot create a T
190e0 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e  EMP index on non
190f0 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73  -TEMP table \"%s
19100 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
19110 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
19120 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19130 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19140 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
19150 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20  wid(pTab) ) pPk 
19160 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
19170 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
19180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
19190 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
191a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
191b0 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
191c0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
191d0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
191e0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
191f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19200 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
19210 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
19220 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
19230 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
19240 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
19250 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
19260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19270 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
19280 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
19290 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
192a0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
192b0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
192c0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
192d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
192e0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
192f0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
19300 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70  3UserAuthTable(p
19310 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23  Tab->zName)==0.#
19320 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
19330 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45  ITE_ALLOW_SQLITE
19340 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20  _MASTER_INDEX.  
19350 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
19360 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  trICmp(&pTab->zN
19370 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29  ame[7],"master")
19380 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  !=0.#endif.     
19390 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
193a0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
193b0 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
193c0 2c 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73  ,9)!=0. ){.    s
193d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
193e0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
193f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
19400 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  xed", pTab->zNam
19410 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
19420 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19430 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
19440 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69  TE_OMIT_VIEW.  i
19450 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
19460 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
19470 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19480 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62  "views may not b
19490 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20  e indexed");.   
194a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
194b0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e  e_index;.  }.#en
194c0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
194d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
194e0 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
194f0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
19500 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19510 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75  g(pParse, "virtu
19520 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
19530 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
19540 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19550 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
19560 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a  #endif..  /*.  *
19570 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  * Find the name 
19580 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d  of the index.  M
19590 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
195a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e  s not already an
195b0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78  other.  ** index
195c0 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74   or table with t
195d0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a  he same name.  .
195e0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74    **.  ** Except
195f0 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20  ion:  If we are 
19600 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65  reading the name
19610 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69  s of permanent i
19620 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a  ndices from the.
19630 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74    ** sqlite_mast
19640 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73  er table (becaus
19650 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
19660 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65  cess changed the
19670 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a   schema) and.  *
19680 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64  * one of the ind
19690 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65  ex names collide
196a0 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  s with the name 
196b0 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  of a temporary t
196c0 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64  able or.  ** ind
196d0 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ex, then we will
196e0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f   continue to pro
196f0 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e  cess this index.
19700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e  .  **.  ** If pN
19710 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
19720 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a  that we are.  **
19730 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
19740 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55  primary key or U
19750 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
19760 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  .  We have to in
19770 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77  vent our.  ** ow
19780 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  n name..  */.  i
19790 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
197a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
197b0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
197c0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
197d0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f   zName==0 ) goto
197e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
197f0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
19800 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20  pName->z!=0 );. 
19810 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
19820 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
19830 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
19840 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
19850 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19860 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19870 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d     if( !IN_RENAM
19880 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
19890 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
198a0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  busy ){.        
198b0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
198c0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
198d0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
198e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
198f0 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
19900 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
19910 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
19920 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
19930 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19940 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
19950 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19960 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
19970 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
19980 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
19990 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
199a0 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29  f( !ifNotExist )
199b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
199c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
199d0 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
199e0 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
199f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
19a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19a10 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
19a20 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
19a30 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
19a40 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
19a50 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
19a60 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
19a70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19a80 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
19a90 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
19aa0 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
19ab0 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
19ac0 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
19ad0 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
19ae0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
19af0 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
19b00 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
19b10 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
19b20 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
19b30 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
19b40 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
19b50 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
19b60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19b70 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20  index;.    }..  
19b80 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
19b90 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72  ndex names gener
19ba0 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  ated from within
19bb0 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
19bc0 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d  _vtab().    ** m
19bd0 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74  ust have names t
19be0 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63 74  hat are distinct
19bf0 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74   from normal aut
19c00 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
19c10 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  es..    ** The f
19c20 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
19c30 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c  nt converts "sql
19c40 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e  ite3_autoindex..
19c50 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22  ." into.    ** "
19c60 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65  sqlite3_butoinde
19c70 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74  x..." in order t
19c80 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73  o make the names
19c90 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a   distinct..    *
19ca0 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e  * The "vtab_err.
19cb0 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e  test" test demon
19cc0 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65 64  strates the need
19cd0 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d 65   of this stateme
19ce0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  nt. */.    if( I
19cf0 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
19d00 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20  ) zName[7]++;.  
19d10 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
19d20 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
19d30 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
19d40 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
19d50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19d60 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
19d70 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
19d80 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  CT ){.    const 
19d90 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
19da0 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  >zDbSName;.    i
19db0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
19dc0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
19dd0 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
19de0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
19df0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
19e00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19e10 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19e20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
19e30 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
19e40 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
19e50 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
19e60 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
19e70 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
19e80 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
19e90 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
19ea0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
19eb0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
19ec0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19ed0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
19ee0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
19ef0 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
19f00 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
19f10 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
19f20 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
19f30 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
19f40 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
19f50 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
19f60 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
19f70 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
19f80 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
19f90 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
19fa0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
19fb0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b  st==0 ){.    Tok
19fc0 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20  en prevCol;.    
19fd0 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26  Column *pCol = &
19fe0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
19ff0 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43  >nCol-1];.    pC
1a000 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
1a010 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a  COLFLAG_UNIQUE;.
1a020 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
1a030 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70  Init(&prevCol, p
1a040 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
1a050 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1a060 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1a070 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20  Parse, 0,.      
1a080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a090 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
1a0a0 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29  ID, &prevCol, 0)
1a0b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1a0c0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1a0d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a0e0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
1a0f0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
1a100 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a110 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69  SetSortOrder(pLi
1a120 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a  st, sortOrder);.
1a130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1a140 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
1a150 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
1a160 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b  pList, "index");
1a170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
1a180 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
1a190 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
1a1a0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
1a1b0 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
1a1c0 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
1a1d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a1e0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
1a1f0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1a200 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1a210 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1a220 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1a230 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1a240 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  Expr!=0 );.    i
1a250 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1a260 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
1a270 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
1a280 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1a290 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1a2a0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
1a2b0 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
1a2c0 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
1a2d0 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
1a2e0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1a2f0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
1a300 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50    nExtraCol = pP
1a310 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k ? pPk->nKeyCol
1a320 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d   : 1;.  pIndex =
1a330 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
1a340 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
1a350 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
1a360 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a390 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
1a3a0 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
1a3b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1a3c0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1a3d0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a3e0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1a3f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1a400 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
1a410 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20  iRowLogEst) );. 
1a420 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1a430 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1a440 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b  ndex->azColl) );
1a450 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
1a460 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78   = zExtra;.  zEx
1a470 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31  tra += nName + 1
1a480 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
1a490 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
1a4a0 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
1a4b0 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
1a4c0 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  ab;.  pIndex->on
1a4d0 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
1a4e0 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75  ror;.  pIndex->u
1a4f0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  niqNotNull = onE
1a500 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20  rror!=OE_None;. 
1a510 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1a520 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49   = idxType;.  pI
1a530 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20  ndex->pSchema = 
1a540 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1a550 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  hema;.  pIndex->
1a560 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  nKeyCol = pList-
1a570 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50  >nExpr;.  if( pP
1a580 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  IWhere ){.    sq
1a590 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
1a5a0 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
1a5b0 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49  , pTab, NC_PartI
1a5c0 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29  dx, pPIWhere, 0)
1a5d0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50  ;.    pIndex->pP
1a5e0 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50  artIdxWhere = pP
1a5f0 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57  IWhere;.    pPIW
1a600 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
1a610 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1a620 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1a630 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20  b, iDb, 0) );.. 
1a640 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1a650 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f   if we should ho
1a660 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74  nor DESC request
1a670 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  s on index colum
1a680 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1a690 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1a6a0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1a6b0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
1a6c0 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72  = -1;   /* Honor
1a6d0 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65   DESC */.  }else
1a6e0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
1a6f0 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ask = 0;    /* I
1a700 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20  gnore DESC */.  
1a710 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20  }..  /* Analyze 
1a720 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
1a730 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72  essions that for
1a740 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  m the terms of t
1a750 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a  he index and.  *
1a760 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72  * report any err
1a770 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d  ors.  In the com
1a780 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
1a790 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1a7a0 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20   exactly.  ** a 
1a7b0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74  table column, st
1a7c0 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
1a7d0 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20  in aiColumn[].  
1a7e0 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72  For general expr
1a7f0 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f  essions,.  ** po
1a800 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61  pulate pIndex->a
1a810 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72  ColExpr and stor
1a820 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69  e XN_EXPR (-2) i
1a830 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20  n aiColumn[]..  
1a840 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73  **.  ** TODO: Is
1a850 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66  sue a warning if
1a860 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   two or more col
1a870 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
1a880 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e  x are identical.
1a890 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1a8a0 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1a8b0 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79  he table primary
1a8c0 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20   key is used as 
1a8d0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
1a8e0 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f   index key..  */
1a8f0 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70  .  pListItem = p
1a900 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49  List->a;.  if( I
1a910 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1a920 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  ){.    pIndex->a
1a930 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1a940 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
1a950 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1a960 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  <pIndex->nKeyCol
1a970 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
1a980 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1a990 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  CExpr;          
1a9a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1a9b0 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65 73  -th index expres
1a9c0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sion */.    int 
1a9d0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1a9e0 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53  er;        /* AS
1a9f0 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65  C or DESC on the
1aa00 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e   i-th expression
1aa10 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
1aa20 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
1aa30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1aa40 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1aa50 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  e */..    sqlite
1aa60 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73  3StringToId(pLis
1aa70 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1aa80 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1aa90 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
1aaa0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
1aab0 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74  IdxExpr, pListIt
1aac0 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  em->pExpr, 0);. 
1aad0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1aae0 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
1aaf0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1ab00 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74    pCExpr = sqlit
1ab10 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ab20 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  e(pListItem->pEx
1ab30 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45  pr);.    if( pCE
1ab40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1ab50 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  MN ){.      if( 
1ab60 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
1ab70 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  ewTable ){.     
1ab80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ab90 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 72  sg(pParse, "expr
1aba0 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74  essions prohibit
1abb0 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45  ed in PRIMARY KE
1abc0 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20  Y and ".        
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45 20          "UNIQUE 
1abf0 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
1ac00 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
1ac10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1ac20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ac30 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1ac40 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
1ac50 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72  pIndex->aColExpr
1ac60 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
1ac70 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    pList = 0;.   
1ac80 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58     }.      j = X
1ac90 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49  N_EXPR;.      pI
1aca0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1acb0 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20  ] = XN_EXPR;.   
1acc0 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1acd0 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1ace0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d  }else{.      j =
1acf0 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   pCExpr->iColumn
1ad00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ad10 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20  j<=0x7fff );.   
1ad20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20     if( j<0 ){.  
1ad30 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e        j = pTab->
1ad40 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  iPKey;.      }el
1ad50 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f  se if( pTab->aCo
1ad60 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
1ad70 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
1ad80 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1ad90 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ada0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1adb0 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a  mn[i] = (i16)j;.
1adc0 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20      }.    zColl 
1add0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = 0;.    if( pLi
1ade0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
1adf0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b  p==TK_COLLATE ){
1ae00 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
1ae10 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1ae20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1ae30 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1ae40 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
1ae50 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
1ae60 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
1ae70 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
1ae80 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
1ae90 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
1aea0 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
1aeb0 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
1aec0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
1aed0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
1aee0 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
1aef0 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20   }else if( j>=0 
1af00 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ){.      zColl =
1af10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1af20 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
1af30 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
1af40 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  ll = sqlite3StrB
1af50 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21  INARY;.    if( !
1af60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
1af70 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
1af80 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
1af90 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
1afa0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1afb0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1afc0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1afd0 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
1afe0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
1aff0 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
1b000 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
1b010 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
1b020 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1b030 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
1b040 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
1b050 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
1b060 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f  the table key to
1b070 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b080 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48  index.  For WITH
1b090 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74  OUT ROWID.  ** t
1b0a0 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21  ables (when pPk!
1b0b0 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1b0c0 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50 52   the declared PR
1b0d0 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a  IMARY KEY.  For.
1b0e0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c    ** normal tabl
1b0f0 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29  es (when pPk==0)
1b100 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
1b110 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  e rowid..  */.  
1b120 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
1b130 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
1b140 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
1b150 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
1b160 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1b170 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30      assert( x>=0
1b180 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61   );.      if( ha
1b190 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
1b1a0 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78  aiColumn, pIndex
1b1b0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b  ->nKeyCol, x) ){
1b1c0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1b1d0 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
1b1e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b1f0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
1b200 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20  mn[i] = x;.     
1b210 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1b220 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[i] = pPk->azCo
1b230 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  ll[j];.        p
1b240 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
1b250 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72  r[i] = pPk->aSor
1b260 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
1b270 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
1b280 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b290 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  ( i==pIndex->nCo
1b2a0 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  lumn );.  }else{
1b2b0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
1b2c0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f  olumn[i] = XN_RO
1b2d0 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  WID;.    pIndex-
1b2e0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  >azColl[i] = sql
1b2f0 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1b300 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
1b310 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
1b320 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1b330 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20  >pNewTable==0 ) 
1b340 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
1b350 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  th(pIndex);..  /
1b360 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
1b370 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63  contains every c
1b380 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62  olumn of its tab
1b390 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20  le, then mark.  
1b3a0 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65 72  ** it as a cover
1b3b0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  ing index */.  a
1b3c0 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
1b3d0 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20  pTab) .      || 
1b3e0 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c  pTab->iPKey<0 ||
1b3f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1b400 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54  Index(pIndex, pT
1b410 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b  ab->iPKey)>=0 );
1b420 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75  .  recomputeColu
1b430 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49  mnsNotIndexed(pI
1b440 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62  ndex);.  if( pTb
1b450 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64  lName!=0 && pInd
1b460 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61  ex->nColumn>=pTa
1b470 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70  b->nCol ){.    p
1b480 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e  Index->isCoverin
1b490 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a  g = 1;.    for(j
1b4a0 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
1b4b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1b4c0 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  ( j==pTab->iPKey
1b4d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b4e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
1b4f0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64  lumnOfIndex(pInd
1b500 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69  ex,j)>=0 ) conti
1b510 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  nue;.      pInde
1b520 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1b530 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1b540 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b550 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1b560 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1b570 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1b580 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
1b590 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
1b5a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
1b5b0 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
1b5c0 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
1b5d0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
1b5e0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
1b5f0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
1b600 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
1b610 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1b620 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
1b630 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1b640 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
1b650 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
1b660 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
1b670 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
1b680 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
1b690 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
1b6a0 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
1b6b0 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
1b6c0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
1b6d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1b6e0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
1b6f0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
1b700 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
1b710 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
1b720 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
1b730 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
1b740 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
1b750 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
1b760 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
1b770 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
1b780 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
1b790 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
1b7a0 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
1b7b0 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20  * Two UNIQUE or 
1b7c0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1b7d0 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73  traints are cons
1b7e0 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e  idered equivalen
1b7f0 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68  t.    ** (and th
1b800 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74  us suppressing t
1b810 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65  he second one) e
1b820 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65  ven if they have
1b830 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a   different.    *
1b840 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20  * sort orders.. 
1b850 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1b860 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
1b870 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
1b880 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68  quences or if th
1b890 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20  e columns of.   
1b8a0 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69   ** the constrai
1b8b0 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66  nt occur in diff
1b8c0 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68  erent orders, th
1b8d0 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
1b8e0 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f  ts are.    ** co
1b8f0 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63  nsidered distinc
1b900 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c  t and both resul
1b910 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e  t in separate in
1b920 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
1b930 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
1b940 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
1b950 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
1b960 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
1b970 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
1b980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1b990 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
1b9a0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1b9b0 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  t( pIdx->idxType
1b9c0 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1b9d0 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20  _APPDEF );.     
1b9e0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1b9f0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29  eIndex(pIndex) )
1ba00 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
1ba10 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64  x->nKeyCol!=pInd
1ba20 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f  ex->nKeyCol ) co
1ba30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
1ba40 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
1ba50 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  KeyCol; k++){.  
1ba60 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1ba70 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f   *z1;.        co
1ba80 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  nst char *z2;.  
1ba90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1baa0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e  dx->aiColumn[k]>
1bab0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
1bac0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
1bad0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
1bae0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
1baf0 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
1bb00 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
1bb10 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
1bb20 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
1bb30 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1bb40 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
1bb50 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
1bb60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
1bb70 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
1bb80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1bb90 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
1bba0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
1bbb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
1bbc0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
1bbd0 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
1bbe0 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
1bbf0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1bc00 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
1bc10 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
1bc20 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
1bc30 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
1bc40 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
1bc50 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
1bc60 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
1bc70 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
1bc80 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
1bc90 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
1bca0 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
1bcb0 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
1bcc0 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
1bcd0 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
1bce0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1bcf0 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
1bd00 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
1bd10 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
1bd20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
1bd30 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
1bd40 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
1bd50 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
1bd60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1bd70 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
1bd80 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
1bd90 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1bda0 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
1bdb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bdc0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1bdd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1bde0 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
1bdf0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1be00 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
1be10 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1be20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1be30 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
1be40 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
1be50 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
1be60 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
1be70 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
1be80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1be90 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79 70        if( idxTyp
1bea0 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
1beb0 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70  E_PRIMARYKEY ) p
1bec0 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69  Idx->idxType = i
1bed0 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  dxType;.        
1bee0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1bef0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1bf00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1bf10 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
1bf20 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69  CT ){..    /* Li
1bf30 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
1bf40 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
1bf50 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
1bf60 68 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  he other.    ** 
1bf70 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1bf80 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
1bf90 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1bfa0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1bfb0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62  =0 );.    if( db
1bfc0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1bfd0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
1bfe0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 49 4e       assert( !IN
1bff0 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
1c000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c010 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1c020 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
1c030 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
1c040 3b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69  ;.      p = sqli
1c050 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
1c060 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
1c070 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
1c080 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1c090 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  e, pIndex);.    
1c0a0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1c0b0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
1c0c0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
1c0d0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1c0e0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  led */.        s
1c0f0 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
1c100 62 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  b);.        goto
1c110 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1c120 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
1c130 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c    db->mDbFlags |
1c140 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43  = DBFLAG_SchemaC
1c150 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28  hange;.      if(
1c160 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1c170 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1c180 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1c190 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 7d  newTnum;.      }
1c1a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c1b0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e  f this is the in
1c1c0 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44  itial CREATE IND
1c1d0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72  EX statement (or
1c1e0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66   CREATE TABLE if
1c1f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65   the.    ** inde
1c200 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  x is an implied 
1c210 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51  index for a UNIQ
1c220 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
1c230 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68  Y constraint) th
1c240 65 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20 63  en.    ** emit c
1c250 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ode to allocate 
1c260 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61  the index rootpa
1c270 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d  ge on disk and m
1c280 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
1c290 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  .    ** the inde
1c2a0 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
1c2b0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
1c2c0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
1c2d0 64 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  dex with.    ** 
1c2e0 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64  content.  But, d
1c2f0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66  o not do this if
1c300 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72   we are simply r
1c310 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
1c320 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20  e_master.    ** 
1c330 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74  table to parse t
1c340 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66  he schema, or if
1c350 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
1c360 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
1c370 6e 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61  ndex.    ** of a
1c380 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1c390 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
1c3a0 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
1c3b0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
1c3c0 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
1c3d0 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65  ted as an implie
1c3e0 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20  d PRIMARY KEY.  
1c3f0 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69    ** or UNIQUE i
1c400 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45  ndex in a CREATE
1c410 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1c420 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
1c430 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a 75  le.    ** has ju
1c440 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
1c450 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
1c460 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
1c470 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1c480 6e 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63 61  n.    ** step ca
1c490 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
1c4a0 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66    */.    else if
1c4b0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1c4c0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20   || pTblName!=0 
1c4d0 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  ){.      Vdbe *v
1c4e0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  ;.      char *zS
1c4f0 74 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  tmt;.      int i
1c500 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1c510 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d  nMem;..      v =
1c520 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1c530 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
1c540 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
1c550 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c560 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
1c570 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1c580 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1c590 44 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  Db);..      /* C
1c5a0 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
1c5b0 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
1c5c0 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e 64   using CreateInd
1c5d0 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a 20  ex. But before. 
1c5e0 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f       ** doing so
1c5f0 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e  , code a Noop in
1c600 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74  struction and st
1c610 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20  ore its address 
1c620 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64  in .      ** Ind
1c630 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73  ex.tnum. This is
1c640 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61 73   required in cas
1c650 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  e this index is 
1c660 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20  actually a .    
1c670 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
1c680 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69   and the table i
1c690 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54  s actually a WIT
1c6a0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1c6b0 2e 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  . In .      ** t
1c6c0 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e  hat case the con
1c6d0 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
1c6e0 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  idTable() routin
1c6f0 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20  e will replace. 
1c700 20 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70       ** the Noop
1c710 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20   with a Goto to 
1c720 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44  jump over the VD
1c730 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  BE code generate
1c740 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20  d below. */.    
1c750 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1c760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c770 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
1c780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c790 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72  eAddOp3(v, OP_Cr
1c7a0 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20  eateBtree, iDb, 
1c7b0 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42  iMem, BTREE_BLOB
1c7c0 4b 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  KEY);..      /* 
1c7d0 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
1c7e0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
1c7f0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1c800 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
1c810 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
1c820 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f  ariable.      */
1c830 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72  .      if( pStar
1c840 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
1c850 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73   n = (int)(pPars
1c860 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20  e->sLastToken.z 
1c870 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50  - pName->z) + pP
1c880 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1c890 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .n;.        if( 
1c8a0 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27  pName->z[n-1]=='
1c8b0 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20  ;' ) n--;.      
1c8c0 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
1c8d0 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
1c8e0 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
1c8f0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1c900 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
1c910 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1c920 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
1c930 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
1c940 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
1c950 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
1c960 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d  IQUE", n, pName-
1c970 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >z);.      }else
1c980 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
1c990 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1c9a0 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
1c9b0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1c9c0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
1c9d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  .        /* zStm
1c9e0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1c9f0 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
1ca00 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
1ca10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1ca20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
1ca30 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
1ca40 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
1ca50 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1ca60 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
1ca70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1ca80 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
1ca90 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
1caa0 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
1cab0 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64  );",.          d
1cac0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
1cad0 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
1cae0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e  E,.          pIn
1caf0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
1cb00 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
1cb10 65 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4d 65  e,.          iMe
1cb20 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  m,.          zSt
1cb30 6d 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  mt.          );.
1cb40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1cb50 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
1cb60 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  .      /* Fill t
1cb70 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
1cb80 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
1cb90 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
1cba0 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
1cbb0 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
1cbc0 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
1cbd0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
1cbe0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1cbf0 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
1cc00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
1cc10 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1cc20 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
1cc30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cc40 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1cc50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1cc60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cc70 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
1cc80 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
1cc90 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
1cca0 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
1ccb0 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
1ccc0 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  x'", pIndex->zNa
1ccd0 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  me));.        sq
1cce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ccf0 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c  v, OP_Expire, 0,
1cd00 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
1cd10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1cd20 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65  umpHere(v, pInde
1cd30 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a  x->tnum);.    }.
1cd40 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1cd50 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1cd60 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1cd70 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1cd80 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1cd90 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1cda0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1cdb0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1cdc0 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1cdd0 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1cde0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1cdf0 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1ce00 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1ce10 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1ce20 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1ce30 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1ce40 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1ce50 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1ce60 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1ce70 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1ce80 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1ce90 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1cea0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1ceb0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1cec0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1ced0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1cee0 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1cef0 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1cf00 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1cf10 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1cf20 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1cf30 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1cf40 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1cf50 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1cf60 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1cf70 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1cf80 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1cf90 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1cfa0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1cfb0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1cfc0 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1cfd0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1cfe0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1cff0 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1d000 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1d010 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1d020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1d030 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c  ex = 0;.  }.  el
1d040 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  se if( IN_RENAME
1d050 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 61  _OBJECT ){.    a
1d060 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1d070 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20  NewIndex==0 );. 
1d080 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49     pParse->pNewI
1d090 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
1d0a0 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1d0b0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
1d0c0 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
1d0d0 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
1d0e0 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
1d0f0 64 65 78 20 29 20 73 71 6c 69 74 65 33 46 72 65  dex ) sqlite3Fre
1d100 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
1d110 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  x);.  sqlite3Exp
1d120 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57  rDelete(db, pPIW
1d130 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  here);.  sqlite3
1d140 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1d150 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
1d160 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1d170 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  e(db, pTblName);
1d180 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d190 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, zName);.}..
1d1a0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
1d1b0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
1d1c0 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
1d1d0 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
1d1e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1d1f0 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
1d200 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
1d210 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
1d220 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
1d230 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
1d240 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1d250 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1d260 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
1d270 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
1d280 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
1d290 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
1d2a0 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
1d2b0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
1d2c0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1d2d0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
1d2e0 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1d2f0 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
1d300 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
1d310 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1d320 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
1d330 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1d340 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
1d350 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
1d360 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1d370 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
1d380 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
1d390 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
1d3a0 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
1d3b0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
1d3c0 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
1d3d0 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
1d3e0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1d3f0 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
1d400 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1d410 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
1d420 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
1d430 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
1d440 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
1d450 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
1d460 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
1d470 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
1d480 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
1d490 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
1d4a0 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
1d4b0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
1d4c0 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
1d4d0 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
1d4e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d4f0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
1d500 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a  dex *pIdx){.  /*
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20  10,  9,  8,  7, 
1d530 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61   6 */.  LogEst a
1d540 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32  Val[] = { 33, 32
1d550 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a  , 30, 28, 26 };.
1d560 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49    LogEst *a = pI
1d570 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b  dx->aiRowLogEst;
1d580 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d  .  int nCopy = M
1d590 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61  IN(ArraySize(aVa
1d5a0 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l), pIdx->nKeyCo
1d5b0 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  l);.  int i;..  
1d5c0 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68 20  /* Indexes with 
1d5d0 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74 69  default row esti
1d5e0 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74  mates should not
1d5f0 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74 61   have stat1 data
1d600 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
1d610 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29 3b  Idx->hasStat1 );
1d620 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66  ..  /* Set the f
1d630 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62  irst entry (numb
1d640 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1d650 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20  e index) to the 
1d660 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20  estimated .  ** 
1d670 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1d680 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72 20  n the table, or 
1d690 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72 20  half the number 
1d6a0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1d6b0 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20  able.  ** for a 
1d6c0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20 20  partial index.  
1d6d0 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20   But do not let 
1d6e0 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72 6f  the estimate dro
1d6f0 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20  p below 10. */. 
1d700 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54   a[0] = pIdx->pT
1d710 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
1d720 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50  ;.  if( pIdx->pP
1d730 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 29  artIdxWhere!=0 )
1d740 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73   a[0] -= 10;  as
1d750 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65  sert( 10==sqlite
1d760 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20  3LogEst(2) );.  
1d770 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b  if( a[0]<33 ) a[
1d780 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20  0] = 33;        
1d790 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d7a0 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 33==sqlite3Log
1d7b0 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a  Est(10) );..  /*
1d7c0 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61   Estimate that a
1d7d0 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20  [1] is 10, a[2] 
1d7e0 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c  is 9, a[3] is 8,
1d7f0 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d   a[4] is 7, a[5]
1d800 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65   is.  ** 6 and e
1d810 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76  ach subsequent v
1d820 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73  alue (if any) is
1d830 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79   5.  */.  memcpy
1d840 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43  (&a[1], aVal, nC
1d850 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73  opy*sizeof(LogEs
1d860 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f  t));.  for(i=nCo
1d870 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  py+1; i<=pIdx->n
1d880 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1d890 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20    a[i] = 23;    
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8b0 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69  assert( 23==sqli
1d8c0 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a  te3LogEst(5) );.
1d8d0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30    }..  assert( 0
1d8e0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1d8f0 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  1) );.  if( IsUn
1d900 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1d910 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ) a[pIdx->nKeyCo
1d920 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l] = 0;.}../*.**
1d930 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1d940 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1d950 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1d960 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1d970 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1d980 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1d990 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1d9a0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1d9b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1d9c0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1d9d0 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1d9e0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1d9f0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1da00 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1da10 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1da20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1da30 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1da40 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1da50 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1da60 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1da70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1da80 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1da90 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1daa0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1dab0 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1dac0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1dad0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1dae0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1daf0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1db00 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1db10 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1db20 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1db30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1db40 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1db50 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1db60 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1db70 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1db80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1db90 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1dba0 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1dbb0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1dbc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1dbd0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1dbe0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1dbf0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1dc00 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1dc10 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1dc20 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1dc30 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1dc40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1dc50 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
1dc60 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1dc70 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EF ){.    sqlite
1dc80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1dc90 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
1dca0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
1dcb0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
1dcc0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1dcd0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
1dce0 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
1dcf0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1dd00 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
1dd10 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1dd20 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1dd30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
1dd40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dd50 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1dd60 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1dd70 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
1dd80 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
1dd90 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
1dda0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
1ddb0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1ddc0 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1ddd0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1dde0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1ddf0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1de00 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1de10 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1de20 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1de30 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1de40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1de50 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1de60 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1de70 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1de80 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1de90 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1dea0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1deb0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1dec0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1ded0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1dee0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1def0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1df00 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1df10 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1df20 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1df30 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1df40 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1df50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1df60 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1df70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1df80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1df90 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1dfa0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1dfb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1dfc0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1dfd0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1dfe0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1dff0 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1e000 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1e010 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1e020 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45  .zDbSName, MASTE
1e030 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e  R_NAME, pIndex->
1e040 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
1e050 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
1e060 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
1e070 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
1e080 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
1e090 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1e0a0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1e0b0 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
1e0c0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
1e0d0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
1e0e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1e0f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
1e100 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
1e110 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
1e120 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
1e130 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
1e140 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1e150 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
1e160 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
1e170 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1e180 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
1e190 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
1e1a0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
1e1b0 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
1e1c0 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
1e1d0 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
1e1e0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
1e1f0 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
1e200 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
1e210 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
1e220 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
1e230 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
1e240 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
1e250 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
1e260 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
1e270 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1e280 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
1e290 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
1e2a0 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
1e2b0 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
1e2c0 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
1e2d0 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
1e2e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
1e2f0 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
1e300 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
1e310 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
1e320 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
1e330 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1e340 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
1e350 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
1e360 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
1e370 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
1e380 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
1e390 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
1e3a0 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
1e3b0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
1e3c0 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
1e3d0 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
1e3e0 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
1e3f0 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
1e400 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
1e410 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
1e420 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
1e430 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
1e440 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
1e450 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
1e460 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
1e470 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
1e480 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1e490 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1e4a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1e4b0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1e4c0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1e4d0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1e4e0 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
1e4f0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1e500 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
1e510 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
1e520 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
1e530 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
1e540 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
1e550 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
1e560 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
1e570 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1e580 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
1e590 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
1e5a0 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
1e5b0 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
1e5c0 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
1e5d0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
1e5e0 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
1e5f0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
1e600 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
1e610 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
1e620 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
1e630 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1e640 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1e650 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
1e660 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
1e670 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1e680 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
1e690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1e6a0 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
1e6b0 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
1e6c0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
1e6d0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
1e6e0 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
1e6f0 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
1e700 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
1e710 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1e720 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1e730 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1e740 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1e750 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1e760 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1e770 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1e780 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1e790 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1e7a0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1e7b0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1e7c0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1e7d0 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72 73  dListAppend(Pars
1e7e0 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69 73  e *pParse, IdLis
1e7f0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
1e800 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c 69  *pToken){.  sqli
1e810 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e820 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
1e830 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1e840 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1e850 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1e860 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
1e870 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
1e880 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1e890 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1e8a0 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  >a = sqlite3Arra
1e8b0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
1e8c0 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74   db,.      pList
1e8d0 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f  ->a,.      sizeo
1e8e0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a  f(pList->a[0]),.
1e8f0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
1e900 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  d,.      &i.  );
1e910 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
1e920 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1e930 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1e940 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1e950 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
1e960 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
1e970 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1e980 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
1e990 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1e9a0 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69  CT && pList->a[i
1e9b0 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  ].zName ){.    s
1e9c0 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
1e9d0 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
1e9e0 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  id*)pList->a[i].
1e9f0 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a  zName, pToken);.
1ea00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
1ea10 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
1ea20 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
1ea30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
1ea40 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1ea50 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1ea60 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1ea70 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1ea80 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1ea90 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1eaa0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
1eab0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1eac0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1ead0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1eae0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1eaf0 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
1eb00 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73  bFreeNN(db, pLis
1eb10 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
1eb20 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
1eb30 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
1eb40 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
1eb50 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
1eb60 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
1eb70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
1eb80 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
1eb90 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
1eba0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1ebb0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1ebc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
1ebd0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1ebe0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1ebf0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1ec00 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
1ec10 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
1ec20 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1ec30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1ec40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
1ec50 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
1ec60 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
1ec70 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
1ec80 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
1ec90 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
1eca0 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
1ecb0 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
1ecc0 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
1ecd0 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
1ece0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
1ecf0 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
1ed00 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
1ed10 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
1ed20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
1ed30 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
1ed40 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
1ed50 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
1ed60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
1ed70 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1ed80 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
1ed90 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
1eda0 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
1edb0 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
1edc0 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
1edd0 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
1ede0 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
1edf0 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
1ee00 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
1ee10 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
1ee20 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
1ee30 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
1ee40 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
1ee50 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
1ee60 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
1ee70 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
1ee80 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
1ee90 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
1eea0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1eeb0 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
1eec0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1eed0 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
1eee0 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
1eef0 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
1ef00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
1ef10 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1ef20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
1ef30 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1ef40 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
1ef50 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
1ef60 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1ef70 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1ef80 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
1ef90 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
1efa0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
1efb0 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
1efc0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
1efd0 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
1efe0 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
1eff0 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
1f000 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
1f010 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
1f020 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
1f030 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
1f040 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
1f050 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
1f060 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
1f070 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
1f080 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
1f090 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
1f0a0 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
1f0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1f0c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1f0d0 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e   iStart<=pSrc->n
1f0e0 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  Src );..  /* All
1f0f0 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
1f100 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
1f110 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70   */.  if( (u32)p
1f120 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1f130 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
1f140 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
1f150 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
1f160 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2a  oc = pSrc->nSrc*
1f170 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e  2+nExtra;.    in
1f180 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77  t nGot;.    pNew
1f190 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1f1a0 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20  loc(db, pSrc,.  
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
1f1c0 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41  eof(*pSrc) + (nA
1f1d0 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
1f1e0 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  Src->a[0]) );.  
1f1f0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1f200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
1f210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f220 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f230 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pSrc;.    }.    
1f240 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pSrc = pNew;.   
1f250 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33   nGot = (sqlite3
1f260 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
1f270 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28   pNew) - sizeof(
1f280 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70  *pSrc))/sizeof(p
1f290 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20  Src->a[0])+1;.  
1f2a0 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d    pSrc->nAlloc =
1f2b0 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   nGot;.  }..  /*
1f2c0 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
1f2d0 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
1f2e0 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
1f2f0 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
1f300 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
1f310 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
1f320 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
1f330 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
1f340 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
1f350 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
1f360 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
1f370 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f   += nExtra;..  /
1f380 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
1f390 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
1f3a0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
1f3b0 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
1f3c0 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
1f3d0 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
1f3e0 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
1f3f0 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
1f400 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
1f410 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
1f420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
1f430 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1f440 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
1f450 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
1f460 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
1f470 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
1f480 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
1f490 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
1f4a0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1f4b0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1f4c0 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1f4d0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1f4e0 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1f4f0 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1f500 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1f510 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1f520 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1f530 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1f540 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1f550 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1f560 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1f570 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1f580 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1f590 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1f5a0 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1f5b0 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1f5c0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1f5d0 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1f5e0 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1f5f0 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1f600 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1f610 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1f620 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1f630 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1f640 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1f650 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1f660 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1f670 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1f680 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1f690 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1f6a0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1f6b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1f6c0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1f6d0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1f6e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1f6f0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1f700 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1f710 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1f720 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1f730 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1f740 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1f750 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1f760 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1f770 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1f780 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1f790 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1f7a0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1f7b0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1f7c0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1f7d0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1f7e0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1f7f0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1f800 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1f810 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1f820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1f830 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1f840 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1f850 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1f860 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1f870 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1f880 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1f890 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1f8a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1f8b0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1f8c0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1f8d0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1f8e0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1f8f0 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1f900 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1f910 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1f920 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1f930 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1f940 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1f950 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1f960 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1f970 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1f980 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1f990 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1f9a0 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1f9b0 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1f9c0 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1f9d0 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1f9e0 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1f9f0 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1fa00 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1fa10 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1fa20 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1fa30 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1fa40 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1fa50 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1fa60 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1fa70 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1fa80 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1fa90 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1faa0 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1fab0 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1fac0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1fad0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1fae0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1faf0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1fb00 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1fb10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1fb20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1fb30 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1fb40 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1fb50 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1fb60 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1fb70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
1fb80 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
1fb90 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1fba0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1fbb0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
1fbc0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
1fbd0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1fbe0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1fbf0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
1fc00 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 1;.    pList->
1fc10 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65  nSrc = 1;.    me
1fc20 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30  mset(&pList->a[0
1fc30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
1fc40 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
1fc50 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  pList->a[0].iCur
1fc60 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  sor = -1;.  }els
1fc70 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  e{.    pList = s
1fc80 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1fc90 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1fca0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1fcb0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
1fcc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1fcd0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1fce0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1fcf0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1fd00 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1fd10 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
1fd20 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
1fd30 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
1fd40 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
1fd50 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1fd60 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
1fd70 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49  tabase ){.    pI
1fd80 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
1fd90 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1fda0 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29  n(db, pDatabase)
1fdb0 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61  ;.    pItem->zDa
1fdc0 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1fdd0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1fde0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c  , pTable);.  }el
1fdf0 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  se{.    pItem->z
1fe00 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1fe10 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1fe20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74  pTable);.    pIt
1fe30 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1fe40 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1fe50 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1fe60 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f  Assign VdbeCurso
1fe70 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20  r index numbers 
1fe80 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
1fe90 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
1fea0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1feb0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
1fec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1fed0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1fee0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1fef0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ff00 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
1ff10 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e  List || pParse->
1ff20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ff30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
1ff40 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ){.    for(i=0, 
1ff50 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1ff60 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1ff70 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1ff80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
1ff90 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
1ffa0 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  k;.      pItem->
1ffb0 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
1ffc0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1ffd0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1ffe0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1fff0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
20000 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
20010 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
20020 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d  ->pSrc);.      }
20030 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
20040 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
20050 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
20060 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
20070 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
20080 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
20090 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
200a0 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
200b0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
200c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
200d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
200e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
200f0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
20100 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
20110 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
20120 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
20130 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
20140 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44  ee(db, pItem->zD
20150 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
20160 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20170 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
20180 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20190 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  (db, pItem->zAli
201a0 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  as);.    if( pIt
201b0 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
201c0 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  By ) sqlite3DbFr
201d0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  ee(db, pItem->u1
201e0 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
201f0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
20200 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69  isTabFunc ) sqli
20210 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
20220 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  e(db, pItem->u1.
20230 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73  pFuncArg);.    s
20240 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
20250 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
20260 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
20270 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
20280 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
20290 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
202a0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
202b0 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
202c0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
202d0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
202e0 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
202f0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c  3DbFreeNN(db, pL
20300 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ist);.}../*.** T
20310 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20320 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
20330 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77  ser to add a new
20340 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20   term to the.** 
20350 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67  end of a growing
20360 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
20370 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
20380 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a   is the part of.
20390 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
203a0 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  se that has alre
203b0 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  ady been constru
203c0 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55  cted.  "p" is NU
203d0 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  LL.** if this is
203e0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
203f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
20400 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20  se.  pTable and 
20410 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65  pDatabase.** are
20420 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
20430 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62   table and datab
20440 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ase named in the
20450 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
20460 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  m..** pDatabase 
20470 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64  is NULL if the d
20480 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61  atabase name qua
20490 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e  lifier is missin
204a0 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c  g - the.** usual
204b0 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74   case.  If the t
204c0 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73  erm has an alias
204d0 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f  , then pAlias po
204e0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61  ints to the.** a
204f0 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20  lias token.  If 
20500 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75  the term is a su
20510 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75  bquery, then pSu
20520 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a  bquery is the.**
20530 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20540 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  t that the subqu
20550 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68  ery encodes.  Th
20560 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20  e pTable and.** 
20570 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65  pDatabase parame
20580 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f  ters are NULL fo
20590 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  r subqueries.  T
205a0 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e  he pOn and pUsin
205b0 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  g.** parameters 
205c0 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  are the content 
205d0 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  of the ON and US
205e0 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ING clauses..**.
205f0 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  ** Return a new 
20600 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e  SrcList which en
20610 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f  codes is the FRO
20620 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a  M with the new.*
20630 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f  * term added..*/
20640 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
20650 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
20660 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  omTerm(.  Parse 
20670 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
20680 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20690 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
206a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
206b0 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61    /* The left pa
206c0 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rt of the FROM c
206d0 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65  lause already se
206e0 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
206f0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
20700 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
20710 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74  able to add to t
20720 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
20730 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
20740 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e  base,       /* N
20750 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
20760 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
20770 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  Table */.  Token
20780 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20   *pAlias,       
20790 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
207a0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
207b0 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f   AS subexpressio
207c0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
207d0 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f  Subquery,      /
207e0 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65  * A subquery use
207f0 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
20800 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
20810 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20  Expr *pOn,      
20820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
20830 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  N clause of a jo
20840 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  in */.  IdList *
20850 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20  pUsing          
20860 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61  /* The USING cla
20870 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
20880 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
20890 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
208a0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
208b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
208c0 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c  if( !p && (pOn |
208d0 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20  | pUsing) ){.   
208e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
208f0 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e  (pParse, "a JOIN
20900 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69   clause is requi
20910 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20  red before %s", 
20920 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f  .      (pOn ? "O
20930 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20  N" : "USING").  
20940 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70    );.    goto ap
20950 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
20960 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
20970 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
20980 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  db, p, pTable, p
20990 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
209a0 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74   p==0 ){.    got
209b0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
209c0 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ror;.  }.  asser
209d0 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a  t( p->nSrc>0 );.
209e0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
209f0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
20a00 73 65 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30  sert( (pTable==0
20a10 29 3d 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30  )==(pDatabase==0
20a20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20a30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c  Item->zName==0 |
20a40 7c 20 70 44 61 74 61 62 61 73 65 21 3d 30 20 29  | pDatabase!=0 )
20a50 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  ;.  if( IN_RENAM
20a60 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65  E_OBJECT && pIte
20a70 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
20a80 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20  Token *pToken = 
20a90 28 41 4c 57 41 59 53 28 70 44 61 74 61 62 61 73  (ALWAYS(pDatabas
20aa0 65 29 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  e) && pDatabase-
20ab0 3e 7a 29 20 3f 20 70 44 61 74 61 62 61 73 65 20  >z) ? pDatabase 
20ac0 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  : pTable;.    sq
20ad0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
20ae0 4d 61 70 28 70 50 61 72 73 65 2c 20 70 49 74 65  Map(pParse, pIte
20af0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e  m->zName, pToken
20b00 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
20b10 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
20b20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
20b30 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
20b40 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
20b50 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
20b60 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
20b70 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
20b80 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
20b90 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
20ba0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
20bb0 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
20bc0 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
20bd0 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
20be0 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
20bf0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
20c00 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
20c10 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
20c20 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
20c30 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
20c40 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
20c50 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20c60 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
20c70 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
20c80 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
20c90 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
20ca0 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
20cb0 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
20cc0 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
20cd0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
20ce0 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
20cf0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
20d00 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
20d10 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
20d20 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
20d30 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
20d40 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
20d50 0a 20 20 69 66 28 20 70 20 26 26 20 70 49 6e 64  .  if( p && pInd
20d60 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20  exedBy->n>0 ){. 
20d70 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
20d80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
20d90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53     assert( p->nS
20da0 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  rc>0 );.    pIte
20db0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
20dc0 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  c-1];.    assert
20dd0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49  ( pItem->fg.notI
20de0 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ndexed==0 );.   
20df0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
20e00 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d  fg.isIndexedBy==
20e10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
20e20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
20e30 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Func==0 );.    i
20e40 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
20e50 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
20e60 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
20e70 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
20e80 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
20e90 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
20ea0 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
20eb0 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
20ec0 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
20ed0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
20ee0 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
20ef0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
20f00 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e        pItem->u1.
20f10 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c  zIndexedBy = sql
20f20 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
20f30 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
20f40 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20  ndexedBy);.     
20f50 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
20f60 65 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20  exedBy = 1;.    
20f70 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
20f80 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
20f90 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
20fa0 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
20fb0 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
20fc0 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
20fd0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
20fe0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
20ff0 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
21000 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
21010 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
21020 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
21030 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21040 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
21050 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
21060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
21070 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
21080 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
21090 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
210a0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
210b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
210c0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
210d0 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
210e0 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
210f0 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
21100 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
21110 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
21120 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
21130 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
21140 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
21150 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
21160 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
21170 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
21180 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
21190 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
211a0 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
211b0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
211c0 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
211d0 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
211e0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
211f0 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
21200 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
21210 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
21220 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
21230 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
21240 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
21250 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
21260 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
21270 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
21280 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
21290 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
212a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
212b0 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
212c0 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
212d0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
212e0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
212f0 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
21300 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
21310 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
21320 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
21330 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
21340 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
21350 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
21360 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
21370 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21380 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
21390 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
213a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
213b0 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
213c0 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
213d0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
213e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
213f0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
21400 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
21410 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
21420 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
21430 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
21440 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
21450 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
21460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
21470 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72  te VDBE code for
21480 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
21490 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
214a0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
214b0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
214c0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
214d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
214e0 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
214f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
21500 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
21510 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
21520 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
21530 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
21540 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
21550 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
21560 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
21570 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
21580 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
21590 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
215a0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
215b0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
215c0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
215d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
215e0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
215f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21600 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
21610 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
21620 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
21630 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
21640 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
21650 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
21660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
21670 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp0(v, OP_AutoC
21680 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ommit);.}../*.**
21690 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
216a0 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ode for a COMMIT
216b0 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61   or ROLLBACK sta
216c0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20  tement..** Code 
216d0 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20  for ROLLBACK is 
216e0 67 65 6e 65 72 61 74 65 64 20 69 66 20 65 54 79  generated if eTy
216f0 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e  pe==TK_ROLLBACK.
21700 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63    Otherwise.** c
21710 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
21720 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a   for a COMMIT..*
21730 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
21740 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  dTransaction(Par
21750 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21760 65 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a  eType){.  Vdbe *
21770 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62  v;.  int isRollb
21780 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ack;..  assert( 
21790 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
217a0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
217b0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
217c0 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d  ( eType==TK_COMM
217d0 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f  IT || eType==TK_
217e0 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  END || eType==TK
217f0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69  _ROLLBACK );.  i
21800 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70  sRollback = eTyp
21810 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  e==TK_ROLLBACK;.
21820 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
21830 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
21840 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
21850 4e 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c  N, .       isRol
21860 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43  lback ? "ROLLBAC
21870 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30  K" : "COMMIT", 0
21880 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
21890 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
218a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
218b0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
218c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
218d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
218e0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f  oCommit, 1, isRo
218f0 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  llback);.  }.}..
21900 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
21910 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
21920 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e   the parser when
21930 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d   it parses a com
21940 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a  mand to create,.
21950 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  ** release or ro
21960 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61  llback an SQL sa
21970 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69  vepoint. .*/.voi
21980 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69  d sqlite3Savepoi
21990 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nt(Parse *pParse
219a0 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20  , int op, Token 
219b0 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
219c0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
219d0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
219e0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
219f0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
21a00 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
21a10 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
21a20 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
21a30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
21a40 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61  RIZATION.    sta
21a50 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
21a60 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20   const az[] = { 
21a70 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53  "BEGIN", "RELEAS
21a80 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d  E", "ROLLBACK" }
21a90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53  ;.    assert( !S
21aa0 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26  AVEPOINT_BEGIN &
21ab0 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  & SAVEPOINT_RELE
21ac0 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f  ASE==1 && SAVEPO
21ad0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20  INT_ROLLBACK==2 
21ae0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
21af0 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41  ( !v || sqlite3A
21b00 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
21b10 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e   SQLITE_SAVEPOIN
21b20 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65  T, az[op], zName
21b30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  , 0) ){.      sq
21b40 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
21b50 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  se->db, zName);.
21b60 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
21b70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
21b80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
21b90 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30  Savepoint, op, 0
21ba0 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44  , 0, zName, P4_D
21bb0 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
21bc0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
21bd0 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73  the TEMP databas
21be0 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76  e is open and av
21bf0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e  ailable for use.
21c00 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
21c10 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
21c20 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  .  Leave any err
21c30 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74  or messages in t
21c40 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
21c50 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
21c60 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
21c70 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
21c80 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
21c90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21ca0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
21cb0 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
21cc0 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
21cd0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
21ce0 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73  tree *pBt;.    s
21cf0 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
21d00 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20  flags = .       
21d10 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
21d20 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20  EADWRITE |.     
21d30 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21d40 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
21d50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
21d60 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
21d70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
21d80 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
21d90 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
21da0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
21db0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
21dc0 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
21dd0 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42  pVfs, 0, db, &pB
21de0 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20  t, 0, flags);.  
21df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
21e10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21e20 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
21e30 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
21e40 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20   database ".    
21e50 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74      "file for st
21e60 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  oring temporary 
21e70 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
21e80 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
21e90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
21ea0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
21eb0 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b  Db[1].pBt = pBt;
21ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
21ed0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
21ee0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
21ef0 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33  E_NOMEM==sqlite3
21f00 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
21f10 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61  (pBt, db->nextPa
21f20 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29  gesize, -1, 0) )
21f30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
21f40 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
21f50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21f60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21f70 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
21f80 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
21f90 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
21fa0 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ie will need to 
21fb0 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66  be verified.** f
21fc0 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  or database iDb.
21fd0 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63    The code to ac
21fe0 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68  tually verify th
21ff0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a  e schema cookie.
22000 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74  ** will occur at
22010 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
22020 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61  top-level VDBE a
22030 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  nd will be gener
22040 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62  ated.** later, b
22050 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  y sqlite3FinishC
22060 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
22070 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
22080 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
22090 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
220a0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
220b0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
220c0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
220d0 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  se);..  assert( 
220e0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
220f0 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
22100 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
22110 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
22120 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
22130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
22140 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
22150 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73  ACHED+2 );.  ass
22160 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
22170 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72  maMutexHeld(pPar
22180 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20  se->db, iDb, 0) 
22190 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54  );.  if( DbMaskT
221a0 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  est(pToplevel->c
221b0 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d  ookieMask, iDb)=
221c0 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  =0 ){.    DbMask
221d0 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  Set(pToplevel->c
221e0 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b  ookieMask, iDb);
221f0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
22200 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
22210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22220 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
22230 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
22240 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
22250 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20  If argument zDb 
22260 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61  is NULL, then ca
22270 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  ll sqlite3CodeVe
22280 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72  rifySchema() for
22290 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68   each .** attach
222a0 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68  ed database. Oth
222b0 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69  erwise, invoke i
222c0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
222d0 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c  se named zDb onl
222e0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
222f0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
22300 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  dSchema(Parse *p
22310 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
22320 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74  r *zDb){.  sqlit
22330 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22340 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
22350 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
22360 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
22370 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
22380 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
22390 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c  ->pBt && (!zDb |
223a0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  | 0==sqlite3StrI
223b0 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44  Cmp(zDb, pDb->zD
223c0 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  bSName)) ){.    
223d0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
223e0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
223f0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
22400 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
22410 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
22420 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
22430 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
22440 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
22450 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
22460 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
22470 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
22480 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
22490 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
224a0 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
224b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
224c0 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
224d0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
224e0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
224f0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
22500 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
22510 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
22520 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
22530 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
22540 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
22550 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
22560 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
22570 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
22580 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
22590 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
225a0 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
225b0 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
225c0 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
225d0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
225e0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
225f0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
22600 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
22610 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
22620 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
22630 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
22640 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
22650 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
22660 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
22670 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
22680 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
22690 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
226a0 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
226b0 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
226c0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
226d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
226e0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
226f0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
22700 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
22710 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
22720 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
22730 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
22740 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
22750 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28  b);.  DbMaskSet(
22760 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
22770 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54  Mask, iDb);.  pT
22780 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69  oplevel->isMulti
22790 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74  Write |= setStat
227a0 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ement;.}../*.** 
227b0 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
227c0 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72  e statement curr
227d0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
227e0 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77  truction might w
227f0 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  rite.** more tha
22800 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61  n one entry (exa
22810 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f  mple: deleting o
22820 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65  ne row then inse
22830 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a  rting another,.*
22840 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74  * inserting mult
22850 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74  iple rows in a t
22860 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69  able, or inserti
22870 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64  ng a row and ind
22880 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20  ex entries.).** 
22890 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75  If an abort occu
228a0 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66  rs after some of
228b0 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61   these writes ha
228c0 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68  ve completed, th
228d0 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65  en it will.** be
228e0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
228f0 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64  do the completed
22900 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64   writes..*/.void
22910 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
22920 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
22930 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
22940 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
22950 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
22960 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
22970 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
22980 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  = 1;.}../* .** T
22990 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
229a0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
229b0 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f  tine if is disco
229c0 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a  vers that it is.
229d0 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ** possible to a
229e0 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  bort a statement
229f0 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65   prior to comple
22a00 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20  tion.  In order 
22a10 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74  to .** perform t
22a20 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75  his abort withou
22a30 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  t corrupting the
22a40 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65   database, we ne
22a50 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75  ed to make.** su
22a60 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  re that the stat
22a70 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74  ement is protect
22a80 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e  ed by a statemen
22a90 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
22aa0 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79  *.** Technically
22ab0 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  , we only need t
22ac0 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f  o set the mayAbo
22ad0 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a  rt flag if the.*
22ae0 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66  * isMultiWrite f
22af0 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73  lag was previous
22b00 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69  ly set.  There i
22b10 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65  s a time depende
22b20 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74  ncy.** such that
22b30 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20   the abort must 
22b40 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20  occur after the 
22b50 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69  multiwrite.  Thi
22b60 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20  s makes.** some 
22b70 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c  statements invol
22b80 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45  ving the REPLACE
22b90 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
22ba0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a  tion algorithm.*
22bb0 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61  * go a little fa
22bc0 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e  ster.  But takin
22bd0 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  g advantage of t
22be0 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65  his time depende
22bf0 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20  ncy.** makes it 
22c00 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74  more difficult t
22c10 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  o prove that the
22c20 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74   code is correct
22c30 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75   (in .** particu
22c40 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73  lar, it prevents
22c50 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67   us from writing
22c60 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a   an effective.**
22c70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
22c80 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  of sqlite3Assert
22c90 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20  MayAbort()) and 
22ca0 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65  so we have chose
22cb0 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65  n.** to take the
22cc0 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20   safe route and 
22cd0 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a  skip the optimiz
22ce0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
22cf0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50  qlite3MayAbort(P
22d00 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
22d10 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
22d20 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
22d30 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
22d40 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d  ;.  pToplevel->m
22d50 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a  ayAbort = 1;.}..
22d60 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
22d70 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65  _Halt that cause
22d80 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65  s the vdbe to re
22d90 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
22da0 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72  ONSTRAINT.** err
22db0 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20  or. The onError 
22dc0 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d  parameter determ
22dd0 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61  ines which (if a
22de0 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65  ny) of the state
22df0 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63  ment.** and/or c
22e00 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
22e10 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
22e20 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
22e30 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
22e40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22e50 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
22e60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
22e70 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20  t errCode,      
22e80 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f  /* extended erro
22e90 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
22ea0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
22eb0 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
22ec0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20   */.  char *p4, 
22ed0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
22ee0 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38   message */.  i8
22ef0 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
22f00 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20  /* P4_STATIC or 
22f10 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a  P4_TRANSIENT */.
22f20 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20    u8 p5Errmsg   
22f30 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67      /* P5_ErrMsg
22f40 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   type */.){.  Vd
22f50 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
22f60 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
22f70 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f    assert( (errCo
22f80 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  de&0xff)==SQLITE
22f90 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20  _CONSTRAINT );. 
22fa0 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
22fb0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
22fc0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
22fd0 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
22fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
22ff0 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f  , OP_Halt, errCo
23000 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  de, onError, 0, 
23010 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73  p4, p4type);.  s
23020 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23030 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
23040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
23050 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
23060 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
23070 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
23080 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
23090 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
230a0 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
230b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
230c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
230d0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
230e0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
230f0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
23100 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
23110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
23120 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
23130 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
23140 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
23150 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
23160 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
23170 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
23180 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
23190 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
231a0 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50  Init(&errMsg, pP
231b0 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  arse->db, 0, 0, 
231c0 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78  200);.  if( pIdx
231d0 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20  ->aColExpr ){.  
231e0 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
231f0 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22  pendf(&errMsg, "
23200 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64  index '%q'", pId
23210 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  x->zName);.  }el
23220 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  se{.    for(j=0;
23230 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j<pIdx->nKeyCol
23240 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; j++){.      ch
23250 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
23260 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
23270 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a  Column[j]>=0 );.
23280 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
23290 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  b->aCol[pIdx->ai
232a0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
232b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20  ;.      if( j ) 
232c0 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
232d0 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22  nd(&errMsg, ", "
232e0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
232f0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c  te3_str_appendal
23300 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d  l(&errMsg, pTab-
23310 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
23320 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
23330 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20  d(&errMsg, ".", 
23340 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
23350 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
23360 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a  &errMsg, zCol);.
23370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72      }.  }.  zErr
23380 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
23390 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
233a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
233b0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
233c0 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
233d0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
233e0 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
233f0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
23420 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
23430 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
23440 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
23450 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
23460 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
23470 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
23480 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
23490 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
234a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
234b0 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
234c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
234d0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
234e0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
234f0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
23500 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
23510 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
23520 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
23530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
23540 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
23550 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
23560 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
23570 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
23580 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
23590 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
235a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
235b0 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
235c0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
235f0 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
23600 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
23610 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
23620 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
23630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
23640 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
23650 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
23660 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
23670 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
23680 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
23690 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
236a0 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
236b0 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
236c0 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
236d0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
23700 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
23710 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
23720 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
23730 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
23740 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
23750 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
23760 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
23770 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
23780 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
23790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
237a0 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
237b0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
237c0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
237d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
237e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
237f0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
23800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
23810 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
23820 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
23830 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
23840 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
23850 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
23860 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
23870 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
23880 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
23890 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
238a0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
238b0 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
238c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
238d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
238e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
238f0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
23900 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
23910 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
23920 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
23930 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
23940 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
23950 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
23960 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
23970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
23980 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
23990 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
239a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
239b0 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
239c0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
239d0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239f0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
23a00 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
23a10 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
23a20 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
23a30 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
23a40 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
23a50 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
23a60 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
23a70 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
23a80 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
23a90 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
23aa0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
23ab0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
23ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
23ad0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
23ae0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
23af0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
23b00 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
23b10 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
23b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
23b30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
23b40 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
23b50 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
23b60 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
23b70 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
23b80 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
23b90 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23ba0 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
23bb0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
23bc0 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
23bd0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
23be0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23bf0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
23c00 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
23c10 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
23c20 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
23c30 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
23c40 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
23c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
23c60 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
23c70 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23ca0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
23cb0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
23cc0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
23cd0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
23ce0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
23cf0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
23d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23d10 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
23d20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
23d30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d50 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
23d60 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
23d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
23d80 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
23d90 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e  xes(db) );  /* N
23da0 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61  eeded for schema
23db0 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72   access */.  for
23dc0 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
23dd0 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
23de0 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
23df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
23e00 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
23e10 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
23e20 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
23e30 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
23e40 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
23e50 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
23e60 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
23e70 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
23e80 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
23e90 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
23ea0 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
23eb0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
23ec0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
23ed0 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
23ee0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
23ef0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
23f20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
23f30 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
23f40 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
23f50 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
23f60 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
23f70 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
23f80 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
23f90 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
23fa0 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
23fb0 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
23fc0 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
23fd0 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
23fe0 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
23ff0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
24000 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
24010 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
24020 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
24030 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
24040 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
24050 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
24060 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
24070 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
24080 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
24090 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
240a0 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
240b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
240c0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
240d0 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
240e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
240f0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
24100 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
24110 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24130 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
24140 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
24150 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
24160 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24180 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
24190 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
241a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
241b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
241c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
241d0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
241e0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
241f0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
24200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
24210 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
24220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24230 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
24240 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
24250 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
24280 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
24290 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
242a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
242b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
242c0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
242d0 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
242e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
242f0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
24300 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
24310 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
24320 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
24330 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
24340 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
24350 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
24360 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
24370 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
24380 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
24390 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
243a0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
243b0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
243c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
243d0 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
243e0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
243f0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
24400 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24410 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
24420 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c  VER(pName2==0) |
24430 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
24440 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
24450 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  l;.    assert( p
24460 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
24470 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
24480 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
24490 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29  rse->db, pName1)
244a0 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  ;.    if( !zColl
244b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
244c0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
244d0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
244e0 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
244f0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
24500 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
24510 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
24520 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
24530 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24540 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
24550 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
24560 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24570 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
24580 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
24590 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
245a0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
245b0 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
245c0 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
245d0 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
245e0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
245f0 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  db, pObjName);. 
24600 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
24610 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
24620 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
24630 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
24640 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
24650 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
24660 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
24670 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
24680 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
24690 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
246a0 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
246b0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
246c0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
246d0 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
246e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
246f0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
24700 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
24710 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
24720 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
24730 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
24740 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
24750 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
24760 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
24770 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
24780 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
24790 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
247a0 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
247b0 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
247c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
247d0 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73  turn a KeyInfo s
247e0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
247f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
24800 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78   the given Index
24810 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24820 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  er should invoke
24830 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
24840 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65  nref() on the re
24850 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a  turned object.**
24860 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e   when it has fin
24870 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a  ished using it..
24880 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
24890 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
248a0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
248b0 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
248c0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
248d0 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
248e0 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d  mn;.  int nKey =
248f0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
24900 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
24910 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
24920 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
24930 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71    if( pIdx->uniq
24940 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  NotNull ){.    p
24950 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
24960 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
24970 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c  ->db, nKey, nCol
24980 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  -nKey);.  }else{
24990 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
249a0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
249b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c  pParse->db, nCol
249c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
249d0 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
249e0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
249f0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
24a00 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ey) );.    for(i
24a10 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
24a20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
24a30 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
24a40 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
24a50 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
24a60 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74  ] = zColl==sqlit
24a70 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20  e3StrBINARY ? 0 
24a80 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
24a90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24aa0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
24ab0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
24ac0 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74       pKey->aSort
24ad0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d  Order[i] = pIdx-
24ae0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
24af0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
24b00 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
24b10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24b20 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45  se->rc==SQLITE_E
24b30 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c  RROR_MISSING_COL
24b40 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66  LSEQ );.      if
24b50 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79  ( pIdx->bNoQuery
24b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
24b70 2a 20 44 65 61 63 74 69 76 61 74 65 20 74 68 65  * Deactivate the
24b80 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 69   index because i
24b90 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e  t contains an un
24ba0 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a  known collating.
24bb0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65          ** seque
24bc0 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77  nce.  The only w
24bd0 61 79 20 74 6f 20 72 65 61 63 74 69 76 65 20 74  ay to reactive t
24be0 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72  he index is to r
24bf0 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20  eload the.      
24c00 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64    ** schema.  Ad
24c10 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67  ding the missing
24c20 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
24c30 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e  nce later does n
24c40 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ot.        ** re
24c50 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  active the index
24c60 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74 69  .  The applicati
24c70 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e 63  on had the chanc
24c80 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20  e to register.  
24c90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73        ** the mis
24ca0 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67  sing index using
24cb0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e   the collation-n
24cc0 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20  eeded callback. 
24cd0 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   For.        ** 
24ce0 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69  simplicity, SQLi
24cf0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65  te will not give
24d00 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
24d10 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65   a second chance
24d20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24d30 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75       pIdx->bNoQu
24d40 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ery = 1;.       
24d50 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
24d60 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59  LITE_ERROR_RETRY
24d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24d80 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
24d90 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ref(pKey);.     
24da0 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d   pKey = 0;.    }
24db0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
24dc0 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ey;.}..#ifndef S
24dd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
24de0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
24df0 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ne is invoked on
24e00 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68  ce per CTE by th
24e10 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70  e parser while p
24e20 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54  arsing a .** WIT
24e30 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69  H clause. .*/.Wi
24e40 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41  th *sqlite3WithA
24e50 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  dd(.  Parse *pPa
24e60 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
24e70 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
24e80 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
24e90 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
24ea0 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63   Existing WITH c
24eb0 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
24ec0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
24ed0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
24ee0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  ame of the commo
24ef0 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  n-table */.  Exp
24f00 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c  rList *pArglist,
24f10 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
24f20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73   column name lis
24f30 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  t for the table 
24f40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75  */.  Select *pQu
24f50 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ery          /* 
24f60 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e  Query used to in
24f70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
24f80 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  le */.){.  sqlit
24f90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24fa0 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65  >db;.  With *pNe
24fb0 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  w;.  char *zName
24fc0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
24fd0 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20  at the CTE name 
24fe0 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e  is unique within
24ff0 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73   this WITH claus
25000 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20  e. If.  ** not, 
25010 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69  store an error i
25020 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
25030 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d  cture. */.  zNam
25040 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
25050 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
25060 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
25070 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74  f( zName && pWit
25080 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
25090 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
250a0 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
250b0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
250c0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
250d0 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e  , pWith->a[i].zN
250e0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
250f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
25100 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
25110 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65  icate WITH table
25120 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
25130 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
25140 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69  }.  }..  if( pWi
25150 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  th ){.    int nB
25160 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57  yte = sizeof(*pW
25170 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70  ith) + (sizeof(p
25180 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57  With->a[1]) * pW
25190 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20  ith->nCte);.    
251a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
251b0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74  Realloc(db, pWit
251c0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  h, nByte);.  }el
251d0 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  se{.    pNew = s
251e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
251f0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
25200 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73  With));.  }.  as
25210 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26  sert( (pNew!=0 &
25220 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64  & zName!=0) || d
25230 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
25240 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  );..  if( db->ma
25250 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
25260 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
25270 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67  tDelete(db, pArg
25280 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
25290 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
252a0 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20  b, pQuery);.    
252b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
252c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  , zName);.    pN
252d0 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65  ew = pWith;.  }e
252e0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lse{.    pNew->a
252f0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65  [pNew->nCte].pSe
25300 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20  lect = pQuery;. 
25310 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
25320 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70  >nCte].pCols = p
25330 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65  Arglist;.    pNe
25340 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
25350 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
25360 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25370 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20  ->nCte].zCteErr 
25380 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
25390 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65  Cte++;.  }..  re
253a0 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
253b0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e  .** Free the con
253c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74  tents of the Wit
253d0 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  h object passed 
253e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
253f0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
25400 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
25410 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
25420 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69  ith *pWith){.  i
25430 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
25440 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
25450 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
25460 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  e; i++){.      s
25470 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20  truct Cte *pCte 
25480 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a  = &pWith->a[i];.
25490 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
254a0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
254b0 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20  pCte->pCols);.  
254c0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
254d0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
254e0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
254f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25500 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
25510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25520 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
25530 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ith);.  }.}.#end
25540 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
25550 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20  QLITE_OMIT_CTE) 
25560 2a 2f 0a                                         */.